说我愿意:
find <paths> -exec cmd '{}' \; -printf <format>;
地点:
-exec cmd '{}'
只打印一行。-printf <format>
只打印一行。输出的顺序是否得到保证,按如下方式交错?
exec line
printf line
exec line
printf line
exec line
printf line
...
即:
find
是否保证-exec;
和printf
测试不会被重新排序?find
是否能保证各个测试不会被批量处理,这样我就不会先运行-exec;
输出,然后再运行-printf
输出?同样的问题适用于相反的顺序,输出相应调整:
find <paths> -printf <format> -exec cmd '{}' \;;
手册确实有以下内容:
GNU find
searches the directory tree rooted at each given starting-point
by evaluating the given expression from left to right, according
to the rules of precedence (see section OPERATORS), until the
outcome is known (the left hand side is false for and operations,
true for or), at which point find moves on to the next file name.
-Olevel
Enables query optimisation. The find program reorders
tests to speed up execution while preserving the overall
effect; that is, predicates with side effects are not
reordered relative to each other. The optimisations
performed at each optimisation level are as follows.
0 Equivalent to optimisation level 1.
1 This is the default optimisation level and
corresponds to the traditional behaviour.
Expressions are reordered so that tests based only
on the names of files (for example -name and
-regex) are performed first.
第一部分似乎排除了批处理,我认为
-exec;
和-printf
被认为有副作用,但尽管如此,尽管我进行了所有测试,我还是希望得到明确的确认。
输出的顺序是否得到保证,按如下方式交错?
对于 GNU
find
,手册指定:
GNU
根据优先级规则 [...],通过从左到右评估给定表达式来搜索以每个给定起点为根的目录树,直到知道结果(左侧为 false)find
操作,对于and
为真),此时or
移动到下一个文件名。find
这个措辞有点尴尬,但它仍然传达了
find
命令中给出的表达式先针对每个考虑的文件进行全面评估,然后再针对下一个文件进行评估,一次一个文件。 因此,find
不会将 -exec
或 -printf
的多个执行组合在一起。-exec
。-exec
和 -printf
操作数由隐式 and
运算符连接,因此 -exec
'd 命令的退出状态很重要,因为它确定 -exec
的计算结果是 true(状态 0)还是 false (任何其他退出状态)。 如果该命令以非零状态退出,则不会评估该文件的 -printf
。因此,在 GNU
find
中,-exec
和 -printf
保证以交错方式进行 评估,首先是 exec
,对应于输出示例,前提是 -exec
的命令始终终止状态为 0。我将省略详细信息,但这同样适用到 POSIX find
.
您可能感兴趣的是,POSIX 和 GNU 都没有明确指定与评估这些操作数相关的输出将以与评估它们相同的顺序发出,因此从这个意义上说,不能保证输出顺序。 尽管如此,这确实是所有find
实现的预期、众所周知且可靠的行为,我知道与评估操作数相关的输出确实是按照与评估操作数相同的顺序写入的。