получите размер файла очень большого файла .gz на 64-битной платформе
Вопрос
В соответствии со спецификацией gz размер файла сохраняется в последних 4 байтах файла .gz.
Я создал 2 файла с
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Я загрузил их в zip-архив
gzip 500M 5G
Я проверил последние 4 байта , выполнив
tail -c4 500M|od -I (returns 512000000 as expected)
tail -c4 5G|od -I (returns 825032704 as not expected)
Похоже, что преодоление невидимого 32-битного барьера делает значение, записанное в ISIZE, совершенно бессмысленным.Что более раздражает, чем если бы вместо этого они использовали какой-то бит ошибки.
Кто-нибудь знает способ получить несжатый размер файла .gz из файла .gz без его извлечения?
Спасибо
спецификация: http://www.gzip.org/zlib/rfc-gzip.html
Редактировать:если кто-нибудь хочет попробовать это, вы могли бы использовать /dev / zero вместо /dev / urandom
Решение
Такого не существует.
Единственный способ получить точный размер сжатого потока - это на самом деле пойти и распаковать его (даже если вы записываете все в /dev / null и просто считаете байты).
Стоит отметить, что ISIZE определяется как
ISIZE (Входной РАЗМЕР)
Это содержит размер исходного (несжатого) входного сигнала
данные по модулю 2^32.
в gzip RFC так что на самом деле это не так ломая при 32-разрядном барьере то, что вы видите, является ожидаемым поведением.
Другие советы
Я не пробовал это с файлом указанного вами размера, но я часто нахожу несжатый размер файла .gz с
zcat file.gz | wc -c
когда я не хочу оставлять несжатый файл без дела или утруждать себя его повторным сжатием.
Очевидно, что данные распаковываются, но затем передаются по конвейеру в wc
.
В любом случае, попробовать стоит.
Редактировать: Когда я попытался создать файл 5G с данными из / dev / random, он создал файл 5G
размером 5120000000, хотя мой файловый менеджер сообщил об этом как о 4.8G
Затем я сжал его с помощью gzip 5G
, результаты 5G.gz
был того же размера (не сильное сжатие Случайный данные).
Тогда zcat 5G.gz | wc -c
сообщается о том же размере, что и исходный файл:5120000000 байт.Так что, во всяком случае, мое предложение, похоже, сработало в этом испытании.
Спасибо, что подождали
у gzip действительно есть опция -l:
-l --list
For each compressed file, list the following fields:
compressed size: size of the compressed file
uncompressed size: size of the uncompressed file
ratio: compression ratio (0.0% if unknown)
uncompressed_name: name of the uncompressed file
The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To
get the uncompressed size for such a file, you can use:
zcat file.Z | wc -c
In combination with the --verbose option, the following fields are also displayed:
method: compression method
crc: the 32-bit CRC of the uncompressed data
date & time: time stamp for the uncompressed file
The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack.
The crc is given as ffffffff for a file not in gzip format.
With --name, the uncompressed name, date and time are those stored within the compress file if
present.
With --verbose, the size totals and compression ratio for all files is also displayed, unless some
sizes are unknown. With --quiet, the title and totals lines are not displayed.