如何使此命令更快: find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \; -打印

如何使此命令更快: find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \; -打印

我的目标是在当前目录中递归地在所有 jar、war、ear 文件的清单中找到一个 jar 条目,并且随后打印找到匹配的存档名称。我正在打印存档的名称,grep 会输出一个匹配项。

命令

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \; -print

有效,但需要很多时间。

我尝试过以下命令,但失败:

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name '*.tar' -print0 | xargs -r0 -P2 zipgrep -rq 'classpath.jar'

给出错误

caution: filename not matched:  ./abc.jar
caution: filename not matched:  ./dsf.jar
/usr/bin/zipgrep: line 97: test: -eq: unary operator expected
/usr/bin/zipgrep: line 100: test: : integer expression expected

答案1

xargs 不再像以前那么有用; find 已得到修复,因此不再需要它。如果您以 a而不是 a结束-exec命令行,find 将在结果本身的批次上调用命令行。正如 mosvy 指出的那样,xargs 确实与 find 并行运行,但我还没有发现这对我的处理非常重要。然而,它可能适合您,因为您正在循环中搜索压缩文件。+;

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -lr "$classpathjarname" {} +

你的替代方案不起作用,因为你不理解它;您的第一个版本的工作方式取决于 zipgrep 通过其退出状态报告文件是否匹配。此变体取决于 zipgrep 报告匹配的文件名,这就是 -l 选项的作用。

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -print0 | xargs -0 -P2 zipgrep -lr "$classpathjarname"

这就是你如何使用 xargs 做到这一点。您的 zipgrep 错误消息是因为您显然有一个文件不是 zip 文件,或者是查找发送到 zipgrep 的空 zip 文件。

话虽如此,它不会比第一种方法快很多,因为第一个脚本花费的绝大多数时间是由于您正在访问压缩文件的内容,并且这需要时间。

相关内容