4

У меня есть архив .tar.gz 32 ГБ, и я хотел бы узнать размер файлов, если я распакую этот сжатый архив. Я бы хотел сначала не распаковывать архив, а потом использовать, например, du .

Можно ли также узнать размер содержащихся файлов, не распаковывая сжатый архив (в системе Linux и / или MacOSX)?

Для другого архива я знаю, что он также содержит файлы .tar.gz. Можно ли также рассчитать размер распакованных архивов, содержащихся в архиве? (например, установив уровень, до которого должна быть смоделирована "распаковка"?)

3 ответа3

4

Конечно. Просто используйте -tv чтобы перечислить содержимое с их размерами. Например

% tar -tvzf sometools2.tar.gz 
-rw-r--r-- madler/admin   3442 2005-02-27 21:40 pngdat.c
-rw-r--r-- madler/admin  24938 2005-02-27 21:39 infgen.c

Если вы хотите сложить размеры (например, du), вы можете использовать awk:

% tar -tvzf sometools2.tar.gz|awk '{ s += $3 } END { print s }'
28380

Для встроенного файла .tar.gz вам нужно будет сделать это индивидуально, когда вы найдете их, отправив их на стандартный stdout с помощью -O:

% tar -tvzf imbed.tar.gz 
-rw-r--r-- madler/staff    505 2012-02-12 00:06 lucas.c
-rw-r--r-- madler/staff  27913 2005-03-20 11:10 lzwtry.c
-rw-r--r-- madler/staff   8314 2005-02-27 21:42 sometools2.tar.gz
% tar -xOzf imbed.tar.gz sometools2.tar.gz | tar -tvzf - | awk '{ s += $3 } END { print s }'
28380

Вы можете написать скрипт, чтобы найти их в выводе -tv а затем извлечь их и даже сделать это рекурсивно. Я оставлю это как упражнение для читателя.

Обратите внимание, что эти параметры предназначены для GNU tar, то есть для Linux и Mac OS X. Опции для BSD tar могут быть разными.

1

Во-первых, вы должны знать, что суффикс .tar.gz означает, что это сжатый tar файл. tar - это просто способ упаковки нескольких файлов и каталогов в один файл. У него нет сжатия по умолчанию. Это где gzip приходит. Это инструмент для сжатия одного файла. Следовательно, вышеупомянутый суффикс означает, что это сжатый пакет файлов и / или каталогов.

Если вы хотите увидеть степень сжатия для каждого файла в заархивированном пакете tar, посмотрите ответ Марка Адлера.

Если вас интересует только весь заархивированный файл (или комплект), правильный способ определения распакованного размера:

gunzip -l ${file}

Пример вывода:

$ gunzip -l syslog.1.gz
     compressed        uncompressed  ratio uncompressed_name
        4465670            33295551  86.6% syslog.1

Сжатые и несжатые числа показывают байты. Ergo мой файл syslog.1 будет около 32 МБ несжатого.

0

Я не знаю, как сделать что-то подобное на терминале (AFAIK это невозможно). Но большинство программных библиотек для извлечения архивов также позволяют запрашивать информацию о содержимом (например, дерево, размер содержимого) без извлечения всего сжатого содержимого.

Таким образом, вы можете создать инструмент командной строки с любым языком программирования, который будет соответствовать вашим потребностям, а затем вызывать его из командной строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .