查找顺序

时间:2014-10-03 11:39:05

标签: find solaris

我一直在处理手册页,并且不知道find如何执行测试的顺序。

请注意Solaris' find命令没有" tests"和"行动"分开,但只是作为表达的一部分进行测试。

在这种情况下,对于

这样的命令行
find . -type d -mount -ctime +5 -prune -exec 'rm {}' \;

是否保证" -type d"和" -ctime + 5"在" -exec' rm {}'之前进行评估\;"因此,只删除正确的文件?

1 个答案:

答案 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).