我想为每个与模式匹配的文件执行命令。但似乎正确的命令对我不起作用,我不知道为什么。
$ 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
因为在其他情况下没有有效的语句(这就是为什么您甚至可能在调试输出中看到段错误或类似的内容)。
我希望这能让您更清楚为什么需要括号。