管道作为 find 的 -exec 参数

管道作为 find 的 -exec 参数

是否可以使用管道命令作为 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 命令的终止方式。

其次,你可以直接替换catgrep lib.

find . -name CMakeLists* -exec grep lib '{}' \;

这基本上意味着在每个搜索结果上“执行 grep lib”。您甚至可以省略 {} 周围的勾号。应该管用。

相关内容