如何告诉 find 根据在每个文件上运行管道的结果打印文件列表?
我知道我们可以使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
仅当 find 使用子 shell 时,才可以使用命令管道作为
-exec
的参数。但是 find 仅执行 一个 命令,并调用 exec() 函数调用以及;
之前的所有后续标记将作为命令参数传递。因此,当需要漂亮的 shell 功能时,您必须自己调用子 shell:
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: