这个 `find -prune` 的行为应该如何理解?

4
根据GNU find的man手册,默认情况下使用-print操作。
阻止默认-print的操作包括-delete-exec-execdir-ok-okdir-fls-fprint-fprintf-ls-print-printf
因此,-prune操作仍应意味着-print操作。
实际上,确实如此。
$ tree .
.
├── dir/
│   └── file2
└── file1

$ find . -name dir #0
./dir

$ find . -name dir -prune #1
./dir #printed as expected

$ find . -name dir -prune -or -name file1 #2
./file1
./dir #printed as expected

然而,有时候-prune会阻止默认的-print
$ find . -name dir -prune -or -name file1 -print #3 #last -print is only added to the above example
./file1

$ find . -name dir -prune -or -print #4
.
./file1

我该如何理解这个矛盾?


我的理解:

#1

  1. file1 不符合 -name dir 的条件,因此被跳过。

  2. dir 符合 -name dir 的条件,因此被剪枝并添加到待办列表中。

  3. 在待办列表中,-print 还被额外应用于 dir

#2

  1. file1 符合 -name file1 的条件,因此被添加到待办列表中。

  2. #1-2 相同

  3. 在待办列表中,-print 还被额外应用于 dirfile1

#3

  1. #2-1 相同

  2. #2-2 相同

  3. -print 应用于 TODO 列表中的 file1

  4. -prune 不会阻止 -print,因此还应该将其应用于 dir。(但这是不正确的。为什么?)

#4

  1. file1 添加到 TODO 列表中。

  2. #3-2 相同

  3. #3-3 相同

  4. #3-4 相同

(实际上,在find中没有TODO列表。请参见此评论标准。)

补充说明:

正如 oguz ismail's answer(现已删除)所指出的,我的问题与 -prune 无关。然而,这个问题还没有解决。

让我们考虑 -name A -o -name B -print。这可以分为两个表达式:-name A 或者 -name B -print

我的理解:第一个表达式 -name A 没有动作。因此应该暗示使用 -print。换句话说,-name A -o -name B -print 应该被解释为 -name A -print -o -name B -print

实际行为: -name A -o -name B -print 是一个复合表达式。在这个复合表达式中已经有了 -print。因此不应该再暗示使用额外的 -print

我认为我的解释更自然,因为在这种情况下,每个文件只满足-name A-name B -print(两个表达式从不同时满足)。

你可能想要查看以下两个与“find”命令中的“-prune”选项相关的问题:如何在sh中使用“-prune”选项的“find”命令?“find”命令中的“-prune”选项是什么意思? - Inian
在find命令中,没有“TODO列表”这样的东西,如果一个条目被列入-print,则会打印出来;就是这样。该表达式将单独针对每个条目进行评估。 - oguz ismail
@oguzismail 我认为TODO清单是否真正存在并不重要。 - ynn
1
关于您最后的编辑,POSIX规范要求这样的行为;因此这不是一个问题,而是对标准维护者的建议。起初它是一个问题,现在已经得到了回答。 - oguz ismail
1
错误使用术语会导致误解。例如,在 POSIX 查找规范中从未使用过“action”一词,但 GNU 对该词的误用导致了您的困惑。 - oguz ismail
1
请阅读整个文档:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html - oguz ismail
1个回答

2

根据这条评论这条评论所述,我的问题概括在OP的补充说明部分中,由于GNU find的man页存在歧义,因此我寻求了解POSIX对此有更好的解释。我发现这是正确的。

POSIX表示:

(如果没有表达式,则应将-print用作表达式。否则,)如果给定的表达式不包含任何主要项-exec-ok-print,则应将给定的表达式有效地替换为:

(给定的表达式) -print

因为given_expression被括在圆括号内,所以自然而然地解释它是一个由一个或多个子表达式组成的复合表达式。(如果这个given_expression只涉及一个子表达式,那么这个圆括号肯定是多余的。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接