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

25776
user238010

Пожалуйста, найдите детали моей ОС:

$ 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 

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

17
Вы уверены в целостности архива? Он сообщает свой собственный сжатый размер как ~ 1.7G. Если это действительно ~ 4 ГБ, я думаю, есть проблема. terdon 10 лет назад 0

4 ответа на вопрос

15
Volker Siegel

Чтобы ответить на заголовок вопроса:

Как я могу получить несжатый размер файла 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 
Параметр `-l` содержит ошибку для файлов размером более 4 ГБ: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775. Flimm 8 лет назад 8
5
Ole Tange

Вы zcatне GNU Zcat, но от сжатия. Пытаться:

gzcat mycontent.DAT.Gz | wc -c gzip -dc mycontent.DAT.Gz | wc -c 
Это распаковывает исходный файл. Может быть, это то, чего хочет ОП, но это не ответ на вопрос. Marco 10 лет назад 0
Ах, это объясняет, почему он искал файл, заканчивающийся на .Z Hennes 8 лет назад 0
1
grosser

gzip -l не работает для меня, просто git -1 ... но это сработало:

unzip -l file.zip 
0
RaZieRSarE

Я нахожу все сайты в Интернете и не решаю эту проблему, получая размер, когда размер файла больше 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 '') | grep -o '[[: digit:]] *' | awk ' END ' 6667023572 
Это было бы лучшим ответом, если бы вы объяснили, что это работает только для тарбаллов, и вы очистили его (тайм-аут не является обязательным, как и grep). kbolino 5 лет назад 0

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