Xargs jar tvf - не работает

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

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

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

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

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

Это не означает (он не печатает какой-либо вывод):

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

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

Ответ 1

Это работает

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

Ответ 2

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

Ответ 3

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