将 -or 和 -exec 与 find 命令结合使用的问题

won*_*rlr 6 shell find

我发现当我将 find 的 -or 运算符与 -exec 结合使用时,我没有得到预期的结果。搜索 .cpp 和 .h 文件时,如果我不使用 -exec,该命令会按预期工作:

find . -name '*.cpp' -or -name '*.h'
./file1.cpp
./file1.h
./file2.cpp
./file2.h
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 -exec 时,似乎只传递了 .h 文件:

find . -name '*.cpp' -or -name '*.h' -exec echo '{}' \;
./file1.h
./file2.h
Run Code Online (Sandbox Code Playgroud)

当我使用更通用的方法返回结果时,它工作正常:

echo $(find . -name '*.cpp' -or -name '*.h')
./file1.cpp ./file1.h ./file2.cpp ./file2.h
Run Code Online (Sandbox Code Playgroud)

但是,我想知道我在使用 -exec 时做错了什么,因为它通常更方便。我使用的是 Mac OSX 10.9,但在 Cygwin 终端中也出现了同样的问题。这里出了什么问题?我怎样才能让 -exec 以我想要的方式工作?

Rob*_*Rob 9

那是因为您的 -exe 操作与 -name "*.h" 相关联,在表达式周围加上括号,它会起作用。默认操作将 -print 这就是初始表达式起作用的原因。

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

如果您使用 | 也是为了提高效率 xargs 而不是 -exec 它在大结果集的情况下要快很多,因为它将运行一个带有列表作为参数的命令,而不是每个返回项的单独调用。