Bash xargs jar tvf-不工作
目标:列出所有JAR中的文件 这项工作:Bash xargs jar tvf-不工作,bash,xargs,Bash,Xargs,目标:列出所有JAR中的文件 这项工作: for f in `find . -name "*.jar"`; do jar tvf $f; done 这也有效: find . -name "*.jar" -exec jar tvf {} \; 这不会(它不会打印任何输出): 为什么后者不起作用?这样行吗 find . -name "*.jar"|xargs -n 1 jar -tvf 问题是jar-tvf只允许传入一个文件 for循环逐个运行这些文件 jar tvf 1.jar; jar t
for f in `find . -name "*.jar"`; do jar tvf $f; done
这也有效:
find . -name "*.jar" -exec 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 ...
您可以通过在命令中放置回显来验证这一点:
for f in `find . -name "*.jar"`; do echo jar tvf $f; done
find . -name "*.jar" | xargs echo jar tvf
find . -name "*.jar" | xargs -n 1 jar tvf
正确的解决方案是告诉xargs每个命令只使用一个参数:
for f in `find . -name "*.jar"`; do echo jar tvf $f; done
find . -name "*.jar" | xargs echo jar tvf
find . -name "*.jar" | xargs -n 1 jar tvf
或
它不起作用,因为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
谢谢你的
-i
提示,很好。@sarnald你必须知道这个参数(-i
)已经被弃用了。参见man xargs(xargs(GNU findutils)4.4.2
):此选项已弃用;改用-I。
在交互模式下使用它没有问题,但我会在脚本中避免它,因为它可能会在未来的xargs版本中消失。