我在 中发现了这种奇怪的行为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