11

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

这有效:

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

这也有效:

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

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

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

为什么后者不起作用?

4

3 回答 3

16

这行得通吗

find . -name "*.jar"|xargs -n 1 jar -tvf
于 2011-07-07T23:46:54.573 回答
9

问题是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
于 2011-07-07T23:50:32.603 回答
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
于 2011-07-07T23:54:41.963 回答