我一直在处理手册页,并且不知道find如何执行测试的顺序。
请注意Solaris' find命令没有" tests"和"行动"分开,但只是作为表达的一部分进行测试。
在这种情况下,对于
这样的命令行find . -type d -mount -ctime +5 -prune -exec 'rm {}' \;
是否保证" -type d"和" -ctime + 5"在" -exec' rm {}'之前进行评估\;"因此,只删除正确的文件?
答案 0 :(得分:0)
<强>解释强>
find
的各种实现往往会在operands
页面中调用man
个不同的名称。但是,遵循find
标准的任何posix
实现的一般执行都将是相同的。
find [-H | -L] path ... [operand_expression ...]
手册页引自posix find man page
其中每组两个触摸expressions
(意思是-operand (Argument)
),没有明确的运算符分隔expressions
,其中有一个隐式-a
(AND)运算符分隔他们。
expression [-a] expression
Conjunction of primaries; the AND operator is implied by the juxtaposition of
two primaries or made explicit by the optional -a operator.
The second expression shall not be evaluated if the first expression is false.
<强>结论强>
因此,遵循posix
标准的任何实现都必须从左到右执行expressions
;和
find . -type d -mount -ctime +5 -prune -exec 'rm {}' \;
相当于
find . -type d -a -mount -a -ctime +5 -a -prune -a -exec 'rm {}' \;
意味着-exec
仅在前面的operands
都为真的情况下执行。
其他强>
同样值得注意的是,虽然您的查找实现可能不会将-exec
称为显式action
,但它仍应以类似方式处理(即替换-print
操作)
If no expression is present, -print shall be used as the expression.
Otherwise, if the given expression does not contain any of the primaries -exec,
-ok, or -print, the given expression shall be effectively replaced by:
( given_expression ) -print
修改强>
技术上确实不是每个实现都必须是posix投诉。他是来自solaris find man page
的几乎完全相同的引用expression [-a] expression
Concatenation of primaries (the and operation is implied by the juxtaposition of two primaries).