for循环查找“find”命令的结果

时间:2017-10-11 17:00:38

标签: bash find

我有这个查找命令:

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

我需要为上面的命令find的每个结果执行此命令:

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

那么我可以用for循环吗?我可以创建将执行我需要的.sh文件吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

使用grepxargs命令的每个结果运行命令的干净方法是使用带有-Z的{​​{1}}或--null标记来使结果以null结尾,并将grep标志与-0结束,以便它期望以null结尾的值,如下所示:

xargs

我删除了find . -name '*.jar' -exec grep -Z BuildConfig {} \; | xargs -0 zip -d RESULTPATH "*/BuildConfig.class 标记,因为它们在您的用例中似乎毫无意义(甚至是有害的)。

但我担心这对你的案子不起作用, 因为Hls文件通常是二进制文件(Java类的压缩存档), 所以我不认为.jar会匹配任何东西。您可以尝试zgrep在jar中搜索。

答案 1 :(得分:0)

->getContainer()->isPrivate($id)命令有两个信息通道。第一个也是最明显的一个当然是grep,它会发送它找到的匹配项。但是如果它找到 no 匹配,它还使用退出值> 0通知你。结合stdout(安静)选项,您可以将其用作-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