为什么使用`-o`时Linux中的`find`会跳过预期结果?

mas*_*tan 7 linux find

为什么在 Linux (Debian 8) 中

touch 1.cpp 1.h
find . -name "*.cpp" -o -name "*.h" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)

仅输出1.h

find . -name "*.cpp" -o -name "*.h"
Run Code Online (Sandbox Code Playgroud)

两者都输出?这是错误还是功能?

ken*_*orb 3

我认为一旦你使用了-or运算符,那么你必须保持它的一致性,以避免当你有多个使用逻辑或连接的条件时逻辑运算的顺序不明确。

看来该-exec部分与第二部分组合在一起-name "*.h"

因此,为了使其正常工作,您必须添加括号,如下所示:

find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
Run Code Online (Sandbox Code Playgroud)

请记住:括号必须用反斜杠引起或转义,以防止它们被解释为特殊的 shell 字符。

或者使用以下方法将几个扩展合并为一个-regex

find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)