我有这个查找命令:
$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \;
我需要为上面的命令find的每个结果执行此命令:
$ zip -d RESULTPATH "*/BuildConfig.class"
那么我可以用for循环吗?我可以创建将执行我需要的.sh文件吗? 谢谢!
答案 0 :(得分:2)
使用grep
为xargs
命令的每个结果运行命令的干净方法是使用带有-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
。