find 命令:-or 选项不起作用

find 命令:-or 选项不起作用

我想为每个与模式匹配的文件执行命令。但似乎正确的命令对我不起作用,我不知道为什么。

$ find . -type f -name '*.c' -or -name '*.h' -or -name '*.cpp' -exec ls {} \;
$ ls
script.sh  test.c  test.h

答案1

尝试将表达式添加到括号中,如手册页中所述:

find . -type f \( -name '*.c' -or -name '*.h' -or -name '*.cpp' \) -exec ls {} \;

应该管用。

答案2

通过GNU find,您可以使用-regex选项:

find . -type f -regex '.*\.\(c\|h\|cpp\)' -exec ls {} \;

答案3

您可以尝试使用find -D tree . [expr..]来了解 find 对原始命令的作用。

您必须明白,-type f-exec ls ..表达式会以比 s 更高的优先级被and'ed 到其余表达式or
因此,您的原始命令将被解析为如下所示:((-type f AND -name *.c) OR -name *.h OR (-name *.cpp AND -exec ls)请注意, or 实际上是二进制而不是三元,所以a | b | c实际上是(a | b) | c,但您明白了)。
现在您会注意到,除了文件匹配之外, find 不知道要做什么,*.cpp因为在其他情况下没有有效的语句(这就是为什么您甚至可能在调试输出中看到段错误或类似的内容)。

我希望这能让您更清楚为什么需要括号。

相关内容