xargs jar tvf - не работает - PullRequest
11 голосов
/ 08 июля 2011

Цель: перечислить файлы во всех банках.

Это работает:

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

Это тоже работает:

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

Это не так (невыведите любой вывод):

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

Почему последний не работает?

Ответы [ 3 ]

14 голосов
/ 08 июля 2011

Работает ли это

find . -name "*.jar"|xargs -n 1 jar -tvf
7 голосов
/ 08 июля 2011

Проблема в том, что 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

Правильным решением является указание xargs использовать только один параметр для каждой команды:

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

или

find . -name "*.jar" | xargs -i jar tvf {} # Find style parameter placement
6 голосов
/ 08 июля 2011

Это не работает, потому что 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
...