我有这个find命令:for循环的结果, “查找” 命令
$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \;
我需要为命令的每个结果执行这个命令可以找到以上:
$ zip -d RESULTPATH "*/BuildConfig.class"
所以我可以做这与循环或不循环?我可以创建.sh文件来做我需要的吗? 谢谢!
我有这个find命令:for循环的结果, “查找” 命令
$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \;
我需要为命令的每个结果执行这个命令可以找到以上:
$ zip -d RESULTPATH "*/BuildConfig.class"
所以我可以做这与循环或不循环?我可以创建.sh文件来做我需要的吗? 谢谢!
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
。
谢谢!你救了我的命 – user269721
干净的方式来运行一个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。
它仍然会包含目录的纯文本名称。 – 123
相关:https://stackoverflow.com/q/9612090/1531971 – jdv
RESULTPATH旨在成为“find命令”所标识的每个文件吗?另外,'.jar'文件是一个zip文件。你的意思是'grep -z'?另外,你的'zip'行上的引号是什么? – ghoti
是的,在resultpath的位置必须是find命令找到的路径。缺少引号 – user269721