find 命令中的运算符优先级?

Wil*_*ard 9 find

见下面的例子:

$ ls -1p
appledir/
applefile
orangedir/
orangefile
$ find . -type f -name apple\*
./applefile
$ find . -type f -name orange\*
./orangefile
$ find . -type f -name apple\* -o -name orange\*
./applefile
./orangedir
./orangefile
$ find . -type f \( -name apple\* -o -name orange\* \)
./applefile
./orangefile
$ 
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现我需要括号才能按预期工作;显然,我还没有内化find评估其论点的优先规则。

我如何轻松预测何时需要以及何时不需要使用括号来明确地对find初选进行分组?

换句话说,我可以想象在给它的命令中find 插入括号的规则是什么,这将使我能够准确预测它将如何评估未分组的表达式?

Ste*_*itt 10

根据文档

请注意,-a当隐式指定(例如通过两个测试之间没有显式运算符出现)或显式指定时,优先级高于-o. 这意味着find . -name afile -o -name bfile -print永远不会打印afile.

所以基本上你可以想象find默认情况下用括号包围任何两个“anded”表达式。您的

find . -type f -name apple\* -o -name orange\*
Run Code Online (Sandbox Code Playgroud)

被解释为

find . \( -type f -name apple\* \) -o -name orange\*
Run Code Online (Sandbox Code Playgroud)

  • @the_velour_fog 没错;事实上,动作也会根据它们是否成功返回真或假。 (4认同)
  • @the_velour_fog,来自 [Unix Power Tools, 3rd Edition](http://docstore.mik.ua/orelly/unix/upt/ch17_12.htm):*"`find` 的业务是评估表达式 - 而不是定位文件。是的,`find` 确实可以定位文件;但这实际上只是一个副作用。对我来说,理解这一点是概念上的突破,使 `find` 变得更加有用。”* (2认同)