目标:列出所有 jar 中的文件。
这有效:
for f in `find . -name "*.jar"`; do jar tvf $f; done
这也有效:
find . -name "*.jar" -exec jar tvf {} \;
这不会(它不打印任何输出):
find . -name "*.jar" | xargs jar tvf
为什么后者不起作用?
这行得通吗
find . -name "*.jar"|xargs -n 1 jar -tvf
问题是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
它不起作用,因为 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