当我发出类似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 部分中描述的原色组成的布尔表达式。
如果不存在表达式,
初级应始终评估为真;它将导致当前路径名被写入标准输出。
你的sudo find . "*dev/null"
事实上是sudo find . "*dev/null" -print
。在此之前没有任何测试-print
可以find
停止评估表达式,因此对于测试的每个路径名-print
都已达到,因此会打印每个路径名。
更多片段:
( expression )
如果expression
为真则为真。
expression [-a] expression
初选的结合; AND 运算符由两个原色的并置隐含或由可选-a
运算符明确表示。如果第一个表达式为 false,则不应计算第二个表达式。
如果不存在表达式,
-exec
、-ok
或( 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 扩展不应改变该工具的总体思路。
-wholename
POSIX 不要求;仍然在 GNU 中,find
它等同于-path
POSIX 所指定的。- 你可能会发现我的另一个答案有趣的。