![将 -or 和 -exec 与 find 命令结合使用时出现问题](https://linux22.com/image/56605/%E5%B0%86%20-or%20%E5%92%8C%20-exec%20%E4%B8%8E%20find%20%E5%91%BD%E4%BB%A4%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我发现当我将 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 ,它对于大型结果集要快得多,因为它将运行一个以列表作为参数的命令,而不是对每个返回的项目进行单独的调用。