如何包含管道 \|在我的 linux 中找到 -exec 命令?

新手上路,请多包涵

这是行不通的。这可以在find中完成吗?还是我需要 xargs?

 find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;

原文由 someguy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 498
2 个回答

将管道符号解释为运行多个进程并将一个进程的输出通过管道传输到另一个进程的输入的指令的工作是 shell(/bin/sh 或等效项)的职责。

在您的示例中,您可以选择使用顶级外壳来执行管道,如下所示:

 find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'

就效率而言,此结果需要调用一次 find、多次调用 zcat 和一次调用 agrep。

这将导致仅生成一个 agrep 进程,该进程将处理由多次调用 zcat 产生的所有输出。

如果你出于某种原因想要多次调用 agrep,你可以这样做:

 find . -name 'file_*' -follow -type f \
    -printf "zcat %p | agrep -dEOE 'grep'\n" | sh

这会使用管道构造一个命令列表来执行,然后将这些命令发送到一个新的 shell 以实际执行。 (省略最后的“| sh”是调试或执行这样的命令行干运行的好方法。)

就效率而言,此结果需要调用一次 find、一次调用 sh、多次调用 zcat 和多次调用 agrep。

就命令调用次数而言,最有效的解决方案是 Paul Tomblin 的建议:

 find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

…这需要一次 find 调用,一次 xargs 调用,几次 zcat 调用和一次 agrep 调用。

原文由 Rolf W. Rasmussen 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决方法很简单:通过 sh 执行

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;

原文由 flolo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题