2017-10-11 149 views
2

我有这个find命令:for循环的结果, “查找” 命令

$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \; 

我需要为命令的每个结果执行这个命令可以找到以上:

$ zip -d RESULTPATH "*/BuildConfig.class" 

所以我可以做这与循环或不循环?我可以创建.sh文件来做我需要的吗? 谢谢!

+0

相关:https://stackoverflow.com/q/9612090/1531971 – jdv

+0

RESULTPATH旨在成为“find命令”所标识的每个文件吗?另外,'.jar'文件是一个zip文件。你的意思是'grep -z'?另外,你的'zip'行上的引号是什么? – ghoti

+0

是的,在resultpath的位置必须是find命令找到的路径。缺少引号 – user269721

回答

0

grep命令有两个通道用于输出信息。第一个也是最明显的一个当然是stdout,它发送它找到的匹配。但是,如果它发现没有匹配,它也使用退出值> 0来通知您。与-q(安静)选项结合使用时,可以将它作为一个更智能的选项find

$ find . -name '*.jar' -exec zgrep -sq BuildConfig {} \; -exec zip -d {} "*/BuildConfig.class" \; 

这是假设你想通过使用grep -Z,当然压缩文件进行搜索。 :)

或者以方便您阅读:

find . -name '*.jar' \ 
    -exec zgrep -sq BuildConfig {} \; \ 
    -exec zip -d {} "*/BuildConfig.class" \; 

查找,以便在每次测试运行。您可以将这些选项看作一系列过滤器; -name选项是第一个过滤器,并且如果先前的-exec没有错误退出,则文件只会传递到第二个-exec

+0

谢谢!你救了我的命 – user269721

2

干净的方式来运行一个grep命令的每个结果将命令与xargs,使用-Z--null标志与grep使由空终止的结果,并且-0标志与xargs使得它预计值终止通过空,像这样:

find . -name '*.jar' -exec grep -Z BuildConfig {} \; | xargs -0 zip -d RESULTPATH "*/BuildConfig.class 

我删除了Hls标志,因为他们似乎都在你的使用情况毫无意义的(甚至是有害的)。

但我怕这会不会实际上是为你工作的情况下, 因为.jar文件通常是一个二进制文件(Java类的压缩文档), 所以我不认为grep永远不会匹配任何内容。您可以尝试在罐子内搜索zgrep

+0

它仍然会包含目录的纯文本名称。 – 123