Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash xargs jar tvf-不工作_Bash_Xargs - Fatal编程技术网

Bash xargs jar tvf-不工作

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

目标:列出所有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 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版本中消失。