Перебрать папки и подсчитать количество файлов в TAR-файлах

Перебрать папки и подсчитать количество файлов в TAR-файлах

Мне нужно просмотреть папки и посчитать файлы в TAR-архивах с одинаковыми именами.

Я попробовал это:

find -name example.tar -exec tar -tf {} + | wc -l

Но это не срабатывает:

tar: ./rajce/rajce/example.tar: Not found in archive
tar: Exiting with failure status due to previous errors
0

Это работает, когда есть только один example.tar.

Мне нужен отдельный номер для каждого файла.

Спасибо!

решение1

Вам нужно tar -tf {} \;вместо того, tar -tf {} +чтобы запускать tarкаждый tarball по отдельности. В GNU man findэто говорит:

   -exec command {} +

          This variant of the -exec action runs the specified
          command on the selected files, but the command line is
          built by appending each selected file name at the end;
          the total number of invocations of the command will be
          much less than the number of matched files.  The command
          line is built in much the same way that xargs builds its
          command lines.  Only one instance of `{}' is allowed
          within the com- mand.  The command is executed in the
          starting directory.

Ваша команда эквивалентна tar tf example.tar example.tar. Также у вас отсутствует [path...]аргумент - некоторые реализации find, например BSD find, вернут find: illegal option -- n ошибку. В общем и целом это должно быть:

find . -name example.tar -exec tar -tf {} \; | wc -l

И обратите внимание, что в этом случае wc -lбудет подсчитано количество файлов во всех example.tarнайденных файлах. Вы можете использовать -maxdepth 1для поиска example.tarфайлов только в текущем каталоге. Если вы хотите искать все example.tarрекурсивно и выводить результаты для каждого из них по отдельности (обратите внимание, что $здесь естьприглашение командной строки используется для обозначения начала новой строки, а не как часть команды):

$ find . -name example.tar -exec sh -c 'tar -tf "$1" | wc -l' sh {} \;
3
3

и с добавленными именами каталогов:

$ find . -name example.tar -exec sh -c 'printf "%s: " "$1" && tar -tf "$1" | wc -l' sh {} \;
./example.tar: 3
./other/example.tar: 3

решение2

Я думаю, что ваша проблема заключается в использовании оператора +для -execоперации find. +Оператор означает «Объединить результаты findв список, разделенный пробелами, и выполнить указанную команду с этим списком в качестве аргумента».

Это означает, что если по разным путям находится более одного файла example.tar(например, два), ваша -execкоманда будет выглядеть так:

tar -tf /path/1/to/example.tar /path/2/to/example.tar

и т.д. Это, однако, будет интерпретироваться как «посмотрите, есть ли файл/путь/2/к/примеру.tarв TAR-файле/путь/1/к/примеру.tar", что, очевидно, не должно иметь места.

Все будет хорошо, если вы измените свой код следующим образом:

find -name example.tar -exec tar -tf {} \; | wc -l

который выполнит tarкоманду отдельно для каждого найденного файла.

Связанный контент