Почему не `найти. имя *.jar | xargs jar tf` работа?

Я управлял этим

find . -name '*.jar' | xargs jar tf

надеясь, что найдет все .jar файлы и выполнить jar tf на них (для просмотра контента). Но это не сработало!!!

1 ответ

Решение

Вы используете xargs а также jar tf неправильный путь.

Первоначальная цель xargs состоит в том, чтобы передать как можно больше файлов одновременно, так что вы получите несколько jar tf file1 file2 file3 file4 ... file200 ... вызовы.

Но jar t, так же, как tar t, принимает только один файл.jar одновременно. Все остальные аргументы действуют как фильтры для того, что перечислить / извлечь. Например, jar tf thing.jar org/example будет только список файлов из подкаталога "org / example".

Так что если вы бежите jar tf file1.jar file2.jar file3.jar, он только читает file1.jar и ожидает, что остальные совпадут с файлами в архиве.

Так что вместо этого нужно сказать xargs запустить команду один раз для каждого файла:

find ... | xargs -d '\n' -n 1 jar tf

(The -d '\n' Опция не имеет ничего общего с вашей проблемой, но, тем не менее, это хорошая идея - на случай, если вы обнаружите некоторые файлы с пробелами в их именах.)

Более прямой способ сделать то же самое:

find ... -exec jar tf {} \;
Другие вопросы по тегам