Мне нужно просмотреть папки и посчитать файлы в 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
команду отдельно для каждого найденного файла.