Ответ 1
Это работает
find . -name "*.jar"|xargs -n 1 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
Почему последние не работают?
Это работает
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
Правильное решение - это сказать, что xargs использует только один параметр для каждой команды:
find . -name "*.jar" | xargs -n 1 jar tvf
или
find . -name "*.jar" | xargs -i jar tvf {} # Find style parameter placement
Это не работает, потому что 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