我发现当我将 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 以我想要的方式工作?
那是因为您的 -exe 操作与 -name "*.h" 相关联,在表达式周围加上括号,它会起作用。默认操作将 -print 这就是初始表达式起作用的原因。
find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;
Run Code Online (Sandbox Code Playgroud)
如果您使用 | 也是为了提高效率 xargs 而不是 -exec 它在大结果集的情况下要快很多,因为它将运行一个带有列表作为参数的命令,而不是每个返回项的单独调用。
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |