Это должно перечислить все файлы из архива, затем найти строки, заканчивающиеся папками/
(), а затем взять количество строк:
tar -tvf file.tar | grep -c '/$'
отредактируйте :, если хотите подсчитывать только каталоги верхнего уровня:
tar --exclude='./*/*' -tvf file.tar | grep -c '/$'
Если вы хотите рекурсивно перейти на один уровень глубже:
tar --exclude='./*/*/*' -tvf file.tar | grep -c '/$'
и так далее...
Единственный метод, который работает корректно во всех случаях, — это использоватьstar -find
:
star -t -v -f file.tar -find -type d | wc -l
работает во всех случаях, даже если имена каталогов не заканчиваются косой чертой. Грязный трюк с добавлением косой черты к именам каталогов был введен примерно в 1980 году, когда формат tar еще не знал о типе файла «каталог». POSIX не требует этого, и существуют реализации tar, которые не добавляют косую черту к именам каталогов.
Обратите внимание, что вам может понадобиться grep для '^ 0 d'
, чтобы убедиться, что вы учитываете только начало реальных строк списка в случае, если пути содержат символы новой строки, или с помощью:
star -t -f file.tar -find -type d -print0 -false
, а затем подсчитать количество нулевых символов в выводе, например, путем передачи вывода в:
LC_ALL=C tr -cd '\0' | wc -c
В GNU tar
или bsdtar
вы можете использовать:
tar tvf file.tar | grep -c '^d'
Как GNU tar
, так и bsdtar
указывают тип файла в качестве первого символа в строке вывода длинного списка(tv
)аналогично ls -l
и отображают новые строки в именах файлов как \n
, так что это все еще работает, если имена членов архива содержат символ новой строки.
Это надежнее, чем поиск завершающих /
символов, как говорит @schily, наличие которых не гарантируется .
Для POSIX можно использовать:
pax -o listopt=%.1M < file.tar | grep -cx d
Хотя это -o listopt
поддерживается не всеми pax
реализациями, в частности неhttp://www.mirbsd.org/pax.htmpax, найденным в Ubuntu.
pax -v < file.tar | grep -c '^d'
будет более переносимым, но может привести к сбою с именами файлов, содержащими символы новой строки.