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