Определить количество каталогов внутри файла tar без его извлечения

while true; do
  echo "0"
  sleep 30
done > /dev/watchdog
2
26.03.2019, 14:06
3 ответа

Это должно перечислить все файлы из архива, затем найти строки, заканчивающиеся папками/(), а затем взять количество строк:

tar -tvf file.tar | grep -c '/$'

отредактируйте :, если хотите подсчитывать только каталоги верхнего уровня:

tar --exclude='./*/*' -tvf file.tar | grep -c '/$'

Если вы хотите рекурсивно перейти на один уровень глубже:

tar --exclude='./*/*/*' -tvf file.tar | grep -c '/$'

и так далее...

3
27.01.2020, 22:02

Единственный метод, который работает корректно во всех случаях, — это использовать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
0
27.01.2020, 22:02

В 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'

будет более переносимым, но может привести к сбою с именами файлов, содержащими символы новой строки.

0
27.01.2020, 22:02

Теги

Похожие вопросы