为什么参数的顺序会影响 find 找到的文件?

为什么参数的顺序会影响 find 找到的文件?

我在 中发现了这种奇怪的行为find。根据参数的顺序,find它会找到不同的文件。

例如,我有一个包含以下内容的目录树。

.
├── configure.ac
├── Makefile.am
└── src
    ├── hello.c
    └── Makefile.am

如果我跑

find -name '*.cpp' -o -name '*.[chS]' -print0 | xargs -0 echo

它列出了

./src/hello.c

如果我跑

find -name '*.[chS]' -o -name '*.cpp' -print0 | xargs -0 echo

它没有列出任何内容。请注意,我唯一更改的是文件名的顺序。

谁能解释为什么第二个命令没有列出任何文件?

答案1

-print0操作仅绑定到第二个-name“过滤器”(用 find 说法进行测试),因此只有在第二个过滤器匹配时才会打印出一些内容。这是因为查找表达式中的默认运算符是, ,并且比( )and绑定更紧密。即你的第二个表达式的计算结果为:or-o

find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo

尝试对过滤器进行分组:

find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo

如果你愿意的话,你也可以这样做:

find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo

相关内容