将 -or 和 -exec 与 find 命令结合使用时出现问题

将 -or 和 -exec 与 find 命令结合使用时出现问题

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

find . -name '*.cpp' -or -name '*.h'
./file1.cpp
./file1.h
./file2.cpp
./file2.h

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

find . -name '*.cpp' -or -name '*.h' -exec echo '{}' \;
./file1.h
./file2.h

当我使用更通用的方法返回结果时,它工作得很好:

echo $(find . -name '*.cpp' -or -name '*.h')
./file1.cpp ./file1.h ./file2.cpp ./file2.h

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

答案1

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

find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;

如果您使用 | 也是为了提高效率xargs 而不是 -exec ,它对于大型结果集要快得多,因为它将运行一个以列表作为参数的命令,而不是对每个返回的项目进行单独的调用。

相关内容