xargs jar tvf - 不起作用

Syn*_*sso 11 bash xargs

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

这有效:

for f in `find . -name "*.jar"`; do jar tvf $f; done
Run Code Online (Sandbox Code Playgroud)

这也有效:

find . -name "*.jar" -exec jar tvf {} \;
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*.jar" | xargs jar tvf
Run Code Online (Sandbox Code Playgroud)

为什么后者不起作用?

Rah*_*hul 14

这有效吗?

find . -name "*.jar"|xargs -n 1 jar -tvf
Run Code Online (Sandbox Code Playgroud)


Swi*_*iss 8

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

for循环逐个运行文件

jar tvf 1.jar; jar tvf 2.jar; ...
Run Code Online (Sandbox Code Playgroud)

但是,xargs尝试尽可能多地在一行上填充参数.因此它正在尝试以下方面:

jar tvf 1.jar 2.jar ...
Run Code Online (Sandbox Code Playgroud)

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

for f in `find . -name "*.jar"`; do echo jar tvf $f; done
find . -name "*.jar" | xargs echo jar tvf
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*.jar" | xargs -n 1 jar tvf
Run Code Online (Sandbox Code Playgroud)

要么

find . -name "*.jar" | xargs -I{} jar tvf {} # Find style parameter placement
Run Code Online (Sandbox Code Playgroud)


Lyn*_*nch 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
Run Code Online (Sandbox Code Playgroud)