Самый быстрый способ разработки несжатого размера большого файла GZIPPED

После того, как файл gzipped, есть способ быстро запросить его, чтобы сказать, что размер несжатого файла (без его распаковки), особенно в тех случаях, когда несжатый файл имеет размер> 4 ГБ.

Согласно RFC https://tools.ietf.org/html/rfc1952#page-5, вы можете запросить последние 4 байта файла, но если несжатый файл был> 4 ГБ, то значение просто представляет uncompressed value modulo 2^32

Это значение также можно получить, запустив gunzip -l foo.gz , однако столбец «несжатый» просто содержит uncompressed value modulo 2^32 снова, по-видимому, поскольку он читает нижний колонтитул, как описано выше.

Мне просто интересно, есть ли способ получить размер несжатого файла без необходимости его сначала распаковать, это было бы особенно полезно в случае, когда gzipped-файлы содержат 50 ГБ + данных, и потребуется некоторое время для распаковки с использованием таких методов, как gzcat foo.gz | wc -c gzcat foo.gz | wc -c


EDIT: ограничение 4GB открыто признано на странице руководства утилиты gzip включенной в OSX ( Apple gzip 242 )

  BUGS According to RFC 1952, the recorded file size is stored in a 32-bit integer, therefore, it can not represent files larger than 4GB. This limitation also applies to -l option of gzip utility. 

3 Solutions collect form web for “Самый быстрый способ разработки несжатого размера большого файла GZIPPED”

Я считаю, что самый быстрый способ – изменить gzip чтобы тестирование в режиме verbose выводило количество декомпрессированных байтов; в моей системе, с файлом 7761108684 байт, я получаю

 % time gzip -tv test.gz test.gz: OK (7761108684 bytes) gzip -tv test.gz 44.19s user 0.79s system 100% cpu 44.919 total % time zcat test.gz| wc -c 7761108684 zcat test.gz 45.51s user 1.54s system 100% cpu 46.987 total wc -c 0.09s user 1.46s system 3% cpu 46.987 total 

Чтобы изменить gzip (1.6, как доступно в Debian), патч выглядит следующим образом:

 --- a/gzip.c +++ b/gzip.c @@ -61,6 +61,7 @@ #include <stdbool.h> #include <sys/stat.h> #include <errno.h> +#include <inttypes.h> #include "closein.h" #include "tailor.h" @@ -694,7 +695,7 @@ if (verbose) { if (test) { - fprintf(stderr, " OK\n"); + fprintf(stderr, " OK (%jd bytes)\n", (intmax_t) bytes_out); } else if (!decompress) { display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr); @@ -901,7 +902,7 @@ /* Display statistics */ if(verbose) { if (test) { - fprintf(stderr, " OK"); + fprintf(stderr, " OK (%jd bytes)", (intmax_t) bytes_out); } else if (decompress) { display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr); } else { 

Если вам нужен размер сжатого файла или набора файлов, лучше всего использовать tar -z или tar -j вместо gzip поскольку tar содержит размер несжатых файлов. Используйте lesspipe чтобы заглянуть в список файлов:

 aptitude install lesspipe lesspipe <compressed file> | less 

Если less настроено использовать lesspipe :

 less <compressed file> 

Просто имейте в виду, что это может занять очень много времени. Однако ваша система остается отзывчивой, что позволяет убить процесс декомпрессии.

Другим подходом было бы записать сжатое соотношение и запросить этот [текстовый] файл:

 gzip --verbose file 2>&1 | tee file.gz.log file: 64.5% -- replaced with file.gz 

Это требует вычисления, чтобы найти реальный размер файла.

Вы также можете сделать то же самое с tar , что на самом деле является тем, что я делаю с резервными копиями большого размера, так как это предотвращает запуск всего процесса декомпрессии только для получения размера файла или имени.

 gunzip -c $file | wc -c 

Это займет много времени, но даст вам окончательный размер в байтах.

  • Используйте gzip для сжатия файлов в каталоге, кроме уже существующих .gz-файлов
  • Терминал замерзает после использования tar или gz
  • tar: Неожиданный EOF в архиве
  • Разархивировать файл .gz без удаления gzip-файла
  • Блокирование HTTP-содержимого gzip с помощью Iptables или Snort?
  • При каких обстоятельствах gunzip & tar xf работает, но tar xzf терпит неудачу?
  • Как я могу изменить первую строку большого файла gzip без распаковки всего этого?
  • Включает ли gzip проверку целостности / crc на .tar?
  • Как получить конечные данные gzip-архива?
  • gzip - перенаправление или трубопроводы?
  • Как проверить, является ли файл gzipped пустым?
  • Linux и Unix - лучшая ОС в мире.