find 中的 -prune 选项有什么作用?

发布于 2024-11-27 01:40:33 字数 349 浏览 0 评论 0原文

我可以看到 find 的 -prune 无法正常工作。我想 -name "efence*" -prune 选项应该选择(或查找)除了名称为 efence* 的文件之外的所有文件,对吗?

还是我的理解有误?

我执行的命令: find * -maxdepth 0 -name "efence*" -prune

期望:选择当前目录下的所有文件 (maxdepth 0),除了带有 name 的文件*围栏。

请帮助我理解 -prune

I can see the -prune of find not working correctly. I guess -name "efence*" -prune option should select (or find) all files except the one with name efence* right?

Or am i wrong in my understanding?

The command i executed:
find * -maxdepth 0 -name "efence*" -prune

Expectation: Select all files at current directory (maxdepth 0) except one with name *efence.

Please help me to understand -prune

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

并安 2024-12-04 01:40:33

如果没有指定其他选项,请尝试

find * -maxdepth 0 -name "efence*" -prune -o -print

prune 选项确实打印匹配的文件(但是,它仍然会阻止 find 递归到匹配目录)。

编辑添加解释:

find 表达式区分 testsactions。来自man find

表达式由选项组成(影响整体操作
而不是处理特定文件,并且始终返回 true),
测试(返回 true 或 false 值)和操作(具有
副作用并返回 true 或 false 值),全部由运算符分隔。省略运算符的情况下假定为 -and

如果表达式除 -prune 之外不包含任何操作,则对表达式为 true 的所有文件执行 -print [我的重点]

因此 -prune 是一个具有副作用的操作,find 不会递归到与前面的测试匹配的子目录(在您的情况下,-maxdepth 0 -name “围栏*”)。但就表达式的真值而言,它相当于仅具有

find * -maxdepth 0 -name "efence*" -true

并且由于您没有指定任何其他操作,因此假定 -print (此假设始终存在,因为它允许您键入例如 find .name "*.java" 而不是 find -name "*.java" -print 。

希望这是有道理的。 另一个线程中接受的答案讨论了同样的事情。

Try

find * -maxdepth 0 -name "efence*" -prune -o -print

The prune option does print matching files, if no other options are specified (it still prevents find from recursing into matching directories, however).

Edited to add explanation:

find expressions distinguish between tests and actions. From man find:

The expression is made up of options (which affect overall operation
rather than the processing of a specific file, and always return true),
tests (which return a true or false value), and actions (which have
side effects and return a true or false value), all separated by operators. -and is assumed where the operator is omitted.

If the expression contains no actions other than -prune, -print is performed on all files for which the expression is true. [my emphasis]

So -prune is an action which has the side effect that find will not recurse into subdirectories which match the preceding test (in your case, -maxdepth 0 -name "efence*"). But in terms of the truth-value of the expression, it's equivalent to just having

find * -maxdepth 0 -name "efence*" -true

and since you didn't specify any other action, -print is assumed (this assumption is always present as it allows you to type e.g. find . -name "*.java" instead of find . -name "*.java" -print).

Hope that makes sense. The accepted answer at the other thread talks about the same thing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文