如何告诉 find 根据在每个文件上运行管道的结果打印文件列表?

发布于 2024-12-08 20:48:31 字数 343 浏览 0 评论 0原文

我知道我们可以使用 find -exec ... 指定要在每个文件上运行的命令,并仅输出命令成功的文件,例如 find 。 -exec 测试 -d {} \; -print 将打印出所有目录。我想给 -exec 一个管道,并让 find 返回管道的最后一个命令返回 true 的文件。

具体来说,我想在每个文件上运行 jar -t ,并 grep 输出类名。我尝试 find 。 -name \*jar -exec jar -tf {} \|grep -q foo \; -print,但它返回所有文件。我怎样才能改变这一点?

I know we can use find -exec ... to specify a command to run on each file, and output only those files for which the command succeeds, for example, find . -exec test -d {} \; -print will print out all the directories. I will like to give -exec a pipeline, and have find return files for which the last command of the pipeline returned true.

To be specific, I would like to run jar -t on each file, and grep the output for a class name. I tried find . -name \*jar -exec jar -tf {} \|grep -q foo \; -print, but its returning all the files. How can I change that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

朮生 2024-12-15 20:48:31

仅当 find 使用子 shell 时,才可以使用命令管道作为 -exec 的参数。但是 find 仅执行 一个 命令,并调用 exec() 函数调用以及 ; 之前的所有后续标记将作为命令参数传递。

因此,当需要漂亮的 shell 功能时,您必须自己调用子 shell:

 $ find . -name '*.jar' -exec sh -c 'jar -tf {} | grep -q foo' \; -print

Using a command pipe as argument to -exec would only work if find would utilize a subshell. But find just executes one command with the an exec() function call and all following tokens up to the ; will be passed as command arguments.

So when in need for nifty shell features, you will have to call the subshell on your own:

 $ find . -name '*.jar' -exec sh -c 'jar -tf {} | grep -q foo' \; -print
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文