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

Modified on: Sat, 30 Jun 2018 11:42:00 +0800

我发现当我将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以我想要的方式工作?

作者:wonderlr

最佳答案

这是因为你的-exe动作与表达式周围的-name“* .h”括号括起来,它会起作用。默认操作将打印初始表达式的原因。

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

如果您使用|,也是为了提高效率xargs而不是-exec使用大的结果集会更快,因为它将运行单个命令,并将列表作为参数而不是每个返回项目的单独调用。

作者:Rob

相关问答

添加新评论