为什么 find 的 -exec 只执行一个结果?

为什么 find 的 -exec 只执行一个结果?

这是我检查的内容:

find mydir -maxdepth 2 -name .project -or -name .classpath

给出输出:

mydir/.project
mydir/.classpath

同时

find mydir -maxdepth 2 -name .project -or -name .classpath -exec echo {} \;

给出输出:

mydir/.classpath

所以只列出了 1 个找到的项目,为什么?

xargs 按预期工作:

find mydir -maxdepth 2 -name .project -or -name .classpath | xargs -I {} echo {};

印刷:

mydir/.project
mydir/.classpath

我错过了什么吗-exec

答案1

表达式find基本上是谓词(布尔条件)的列表。在几乎所有布尔上下文(包括find表达式)中,AND运算符优先于OR。如果我添加一些括号来明确说明优先级规则,那么您的第二个find表达式在逻辑上相当于

( -name .project ) OR ( -name .classpath AND -exec echo)

为了获得您想要的行为,您需要

find mydir -maxdepth 2 \( -name .project -o -name .classpath \) -exec ... {} \;

相关内容