是否可以使用管道命令作为 find-exec
选项的参数?这意味着,我想做这样的事情:
find . -name CMakeLists* -exec cat '{}' | grep lib \;
我试图cat '{}' | grep lib
对每个文件执行,但这不起作用。引用也不起作用。有人有建议吗?
更新:
特定问题已得到解答。现在,有没有办法让通用find <path> -type f -name <name> -exec <pipeline-command>
模式发挥作用?
答案1
find . -type f -name "CMakeLists*" -exec grep lib /dev/null {} +
这发现文件在当前目录中,其基本名称以字符串 或 开头CMakeLists
。该参数被转义(双引号),以便 shell 在find
运行之前不会扩展它。
没有必要添加cat
一个管道来grep
——这是一个无用的进程,有无用的IO,在这里。添加/dev/null
确保grep
当有多个文件需要匹配时,将报告文件名以及匹配行。
通过用作{} +
参数的终止序列-exec
,多个文件名将传递给grep
命令的每次调用。如果我们使用的话,就会生成{} \;
一个进程grep
每一个找到文件。如果进行数百或数千次,不必要的流程实例化将是昂贵的。
要使用带有参数的管道find
-exec
,您需要调用 shell。一个人为的示例可能是grep
字符串“one”,但前提是字符串“two”也不存在。这可以这样做:
find . -type f -name "CMakeLists*" -exec sh -c 'grep one "$@"|grep -v two' sh {} +
这是基于下面 @muru、@Serg 和 @Scott 的评论,谢谢。
答案2
首先,这不是 find 命令的终止方式。
其次,你可以直接替换cat
为grep lib
.
find . -name CMakeLists* -exec grep lib '{}' \;
这基本上意味着在每个搜索结果上“执行 grep lib”。您甚至可以省略 {} 周围的勾号。应该管用。