obtenir le filesize de très gros fichier .gz sur une plate-forme 64 bits
Question
Selon le Specifiction de gz la taille du fichier est enregistré dans les dernières 4bytes d'un fichier .gz.
J'ai créé 2 fichiers avec
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Je les gziped
gzip 500M 5G
J'ai vérifié les 4 derniers octets faisant
tail -c4 500M|od -I (returns 512000000 as expected)
tail -c4 5G|od -I (returns 825032704 as not expected)
Il semble que frapper la barrière invisible 32bit, rend la valeur écrite dans le iSize complètement absurde. Ce qui est plus ennuyeux, que si elles avaient utilisé un certain bit d'erreur.
Quelqu'un sait-il d'une façon d'obtenir la taille du fichier .gz non compressé de la .gz sans l'extraire?
Merci
spécification: http://www.gzip.org/zlib/rfc-gzip. html
modifier: si quelqu'un pour l'essayer, vous pouvez utiliser / dev / zero au lieu de / dev / urandom
La solution
Il n'y a pas.
La seule façon d'obtenir la taille exacte d'un flux compressé est d'aller réellement et décompressez (même si vous écrivez tout à / dev / null et il suffit de compter les octets).
Il vaut la peine de noter que iSize est défini comme
iSize (entrée SIZE)
Celui-ci contient la taille de l'entrée (non compressé) d'origine
données modulo 2 ^ 32.
dans le gzip RFC il est donc pas vraiment casser à la barrière 32 bits, ce que vous voyez est le comportement attendu.
Autres conseils
Je ne l'ai pas essayé avec un fichier de la taille que vous avez mentionné, mais je trouve souvent les non compressé taille d'un fichier .gz avec
zcat file.gz | wc -c
quand je ne veux pas quitter le fichier non compressé qui traînent, ou la peine de le comprimer à nouveau.
De toute évidence, les données non compressées, mais est ensuite canalisé vers wc
.
Il vaut la peine d'essayer, de toute façon.
EDIT: Quand j'ai essayé de créer un fichier 5G avec des données de / dev / random il a produit un 5G
de fichier de taille 5120000000, bien que mon gestionnaire de fichiers a rapporté ce que 4.8g
Puis je l'ai compressé avec gzip 5G
, les résultats 5G.gz
était la même taille (pas beaucoup de compression aléatoire données).
Alors zcat 5G.gz | wc -c
a rapporté la même taille que le fichier original: 5120000000 octets. Donc, ma suggestion semble avoir travaillé pour ce procès, de toute façon.
Merci pour l'attente
gzip a une option -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.