Як я можу отримати нестиснений розмір файлу gzip, фактично не розпаковуючи його?


25

Будь ласка, знайдіть мої дані про ОС:

$ uname -a
AIX xxyy 1 6 000145364C00

Я спробував виконати таку команду, щоб отримати розмір файлу в архіві gzip:

$ gzip -l mycontent.DAT.Gz
compressed  uncompr.   ratio   uncompressed_name
-1223644243 1751372002 -75.3%  mycontent.DAT.Gz

Не знаєте, як інтерпретувати нерозпакований розмір із цього. Розмір стисненого файлу близько 4 Гб.

Отже, я спробував цю опцію, щоб захопити правильні дані:

$ zcat mycontent.DAT.Gz | wc -c

Це дає мені цю помилку:

mycontent.DAT.Gz.Z:A file or directory in the path name does not exist.
0

Скажіть, будь ласка, як зафіксувати це значення з скрипту оболонки, не розпаковуючи вихідний файл?


Ви впевнені в цілісності архіву? Він повідомляє про власний стислий розмір як ~ 1,7G. Якщо це дійсно ~ 4 Гб, я б здогадався, що є проблема.
тердон

Відповіді:


26

Щоб відповісти на назву питання:

Як я можу отримати нестиснений розмір файлу gzip, фактично не розпаковуючи його?

Як ви, очевидно, знаєте, що варіант -l( --list) зазвичай показує нестиснений розмір.
Що він показує, не обчислюється з даних, а зберігається у заголовку як частина стислого файлу.

У вашому випадку -lопція чомусь не працює.
Але неможливо «виміряти» нестиснений розмір від необроблених стислих даних - у стислих даних просто немає інформації про що-небудь інше, - що не дивно, оскільки точка стиснення полягає в тому, щоб не залишати нічого непотрібного.

Вам не потрібно зберігати нестиснені дані на диску: zcat file.gz | wc -cце правильний підхід - але, як відповів @OleTange, ваш, zcatздається, не такий, з якого gzip.
Альтернативою є використання gzipпараметрів -d( --decompress) та -c( --to-stdout) у поєднанні з wcопцією -c( --bytes):

gzip -dc file.gz | wc -c

13
-lВаріант має помилку для файлів розміром більше 4 Гб: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Флімм

6

Ви zcatне GNU zcat, а компрес. Спробуйте:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c

Це розпаковує вихідний файл. Може, це те, чого хоче ОП, але це не відповідь на питання.
Марко

Так, це пояснює, чому він шукав файл, що закінчується .Z
Hennes,

0

gzip -l не працював для мене, просто git -1 ... але це було так:

unzip -l file.zip

0

Я знаходжу всі сайти в Інтернеті, і не вирішую цю проблему, отримуйте розмір, коли розмір файлу перевищує 4 Гб.

моє рішення таке :

[oracle @ base tmp] $ timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz
    -rw-r - r-- oracle / oinstall 111828 2018-03-03 03:05 oracle.20180303.030001.log
    -rw-r ----- oracle / oinstall 6666911744 2018-03-03 03:05 oracle.20180303.030001.dmp

для отримання загального розміру з файлу gz:

[oracle @ base tmp] $ echo $ (timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}') | grep -o '[[: цифра:]] *' | awk '{sum + = $ 1} END {print sum}'
    6667023572

1
Це буде кращою відповіддю, якби ви пояснили, що він працює лише для тарболів, і ви очистили його (тайм-аут не потрібен, і не є грепом).
kbolino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.