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

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

user238010
источник
Вы уверены в целостности архива? Он сообщает свой собственный сжатый размер как ~ 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
Volker Siegel
источник
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
RaZieRSarE
источник
1
Это было бы лучшим ответом, если бы вы объяснили, что это работает только для тарбаллов, и вы очистили его (тайм-аут не является обязательным, а также не grep).
Кболино