当没有测试标志时,为什么“find”只打印它正在搜索的目录?

当没有测试标志时,为什么“find”只打印它正在搜索的目录?

当我发出类似sudo find . "*dev/null"bash 的命令时,shell 会打印出与表达式匹配的目录以及它搜索以查找匹配项的每个目录。

然而,当我发出一个添加测试条件(如 )的标志时sudo find . -wholename "*dev/null",shell 只会打印出与我正在搜索的表达式匹配的目录(以及我无权访问的任何目录)。

我查看了手册页,但找不到任何指定为什么向find命令添加测试会导致它的内容不是打印每个搜索到的目录。谁能解释为什么该find命令在测试实例中不打印?

答案1

sudo find . "*dev/null"两者中.*dev/null都是起点。没有明确的测试,一切都匹配。这几乎就像你跑步一样

sudo find .
sudo find "*dev/null"

后者最有可能打印find: '*dev/null': No such file or directory,但前者发现一切.

sudo find . -wholename "*dev/null"片段中-wholename "*dev/null"是实际测试。


来自POSIX规范,以下片段是相关的:

find实用程序应从路径指定的每个文件递归地沿目录层次结构下降,评估由遇到的每个文件的 OPERANDS 部分中描述的原色组成的布尔表达式。

如果不存在表达式,-print则应将其用作表达式。

-print
初级应始终评估为真;它将导致当前路径名被写入标准输出。

你的sudo find . "*dev/null"事实上是sudo find . "*dev/null" -print。在此之前没有任何测试-print可以find停止评估表达式,因此对于测试的每个路径名-print都已达到,因此会打印每个路径名。

更多片段:

( expression )
如果expression为真则为真。

expression [-a] expression
初选的结合; AND 运算符由两个原色的并置隐含或由可选-a运算符明确表示。如果第一个表达式为 false,则不应计算第二个表达式。

如果不存在表达式,-print则应将其用作表达式。否则,如果给定表达式不包含任何原色-exec-ok-print,则给定表达式应有效地替换为:

( given_expression ) -print

注意:实现可能会添加到集合-exec, -ok, -print

你的sudo find . -wholename "*dev/null"相当于

sudo find . \( -wholename "*dev/null" \) -a -print

(括号被转义,因为它们对于 shell 来说是特殊的)。

现在,如果-wholename "*dev/null"评估为 false,-print则不会评估,因为这就是-a工作原理。这样,给定路径名的失败测试将阻止find打印路径名。


笔记:

  • 非 POSIX 扩展不应改变该工具的总体思路。
  • -wholenamePOSIX 不要求;仍然在 GNU 中,find它等同于-pathPOSIX 所指定的。
  • 你可能会发现我的另一个答案有趣的。

相关内容