根据find
的手册页,OR 与表达式一起使用:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
那么为什么它也适用-print
于本例中的诸如 之类的动作呢?
find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print
根据find
的手册页,OR 与表达式一起使用:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
那么为什么它也适用-print
于本例中的诸如 之类的动作呢?
find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print
动作也是表达;它们是具有副作用的表达式。(POSIX甚至没有提到动作。)
在
-exec
's 的情况下,表达式的值反映了正在运行的命令的状态:如果成功,由退出代码 0 指示,则表达式的值为真,否则为假。所以从当前目录递归;对于作为目录的文件,它执行
sh
运行printf
(在目录后添加正斜杠);对于其他一切,它运行find
的print
动作。是和之间的-or
析取;这里重要的值是's,而不是's。-type d -exec ...
-print
-type d
-exec
更详细地说,
find
的优先规则意味着可以更明确地写成
表达式
-or
连接分别是和
从左边开始,为每个文件评估整个表达式集(在该术语的一般含义中,即包括目录等):
-type d
如果当前文件是一个目录,则评估为 true,否则为 false。-exec ...
如果前一个表达式为真,则评估,因此如果当前文件是目录;它的评估涉及sh -c 'printf "%s/\n" "$0"'
以当前文件作为参数运行,如果sh
以状态 0 退出,则结果为真,否则为假。-print
如果前一个表达式(-type
和-exec
)的结果为false,则评估,即当前文件不是目录,或者它是但sh
失败了。一个小
-o
的完全切换输出;有两个文件(包含“111”和“2 2”)和两个匹配“test*”的不可分类目录第一个(隐式
-a
)-print
在每个成功之后执行-exec
。对于 dirs,错误消息被重定向,并且 -print 未被“评估” - 逻辑 AND 链被破坏。第二个(“cat OR print”)仅在失败时打印。
prune 的例子隐藏在 man find 中;我很难理解它。
这些 AND-OR-lists 很棘手,而且优先级也很重要,然后你很快就会需要这些 nice
\(parens\)
。Find 生成丑陋的命令行,但是很好的查询!