xargs jar tvf - 不起作用

时间:2011-07-07 23:43:54

标签: bash xargs

目标:列出所有罐子中的文件。

这有效:

for f in `find . -name "*.jar"`; do jar tvf $f; done

这也有效:

find . -name "*.jar" -exec jar tvf {} \;

这不是(它不打印任何输出):

find . -name "*.jar" | xargs jar tvf

为什么后者不起作用?

3 个答案:

答案 0 :(得分:14)

这是否有效

find . -name "*.jar"|xargs -n 1 jar -tvf

答案 1 :(得分:7)

问题是jar tvf只允许传入一个文件。

for循环逐个运行文件

jar tvf 1.jar; jar tvf 2.jar; ...

但是,xargs尝试尽可能多地在一行上插入参数。因此它正在尝试以下方法:

jar tvf 1.jar 2.jar ...

您可以通过在命令中放置一个echo来验证这一点:

for f in `find . -name "*.jar"`; do echo jar tvf $f; done
find . -name "*.jar" | xargs echo jar tvf

正确的解决方案是告诉xargs每个命令只使用一个参数:

find . -name "*.jar" | xargs -n 1 jar tvf

find . -name "*.jar" | xargs -i jar tvf {} # Find style parameter placement

答案 2 :(得分:6)

它不起作用,因为xargs只调用一个包含所有参数的进程。

有一种方法可以使用-I'{}'为每个参数调用一个新进程。

试着理解:

$ seq 10 | xargs echo
1 2 3 4 5 6 7 8 9 10
$ seq 10 | xargs -I'{}' echo {}
1
2
3
4
5
6
7
8
9
10
相关问题