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

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 '[[: digit:]] *' | awk '{sum + = $ 1} END {print sum}'
    6667023572

1
Это было бы лучшим ответом, если бы вы объяснили, что это работает только для тарбаллов, и вы очистили его (тайм-аут не является обязательным, а также не grep).
Кболино
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.