ottenere la dimensione del file di file molto grande .gz su una piattaforma a 64 bit
Domanda
Secondo lo specifiction del gz la dimensione del file viene salvata negli ultimi 4bytes di un file .gz.
Ho creato 2 file con
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Io li gziped
gzip 500M 5G
Ho controllato gli ultimi 4 byte facendo
tail -c4 500M|od -I (returns 512000000 as expected)
tail -c4 5G|od -I (returns 825032704 as not expected)
Sembra che colpisce la barriera invisibile a 32 bit, rende il valore scritto nella iSize completamente senza senso. Che è più fastidioso, che se avessero usato qualche po 'di errore.
Qualcuno sa di un modo per ottenere la dimensione del file .gz non compressa dalla .gz, senza estrarlo?
grazie
specifica: http://www.gzip.org/zlib/rfc-gzip. html
modifica: se qualcuno di provarlo, è possibile utilizzare / dev / zero invece di / dev / urandom
Soluzione
Non è uno.
L'unico modo per ottenere la dimensione esatta di un flusso compresso è quello di andare effettivamente e decomprimere (anche se si scrive di tutto per / dev / null e basta contare i byte).
È importante notare che iSize è definito come
iSize (SIZE ingresso)
Questa contiene le dimensioni del l'ingresso originale (non compresso)
dati modulo 2 ^ 32.
RFC quindi non è in realtà rottura alla barriera a 32 bit, il comportamento quello che stai vedendo è previsto.
Altri suggerimenti
Non ho provato questo con un file delle dimensioni che hai menzionato, ma spesso mi trovare il non compresso dimensioni di un file .gz con
zcat file.gz | wc -c
quando non voglio lasciare il file non compresso in giro, o preoccuparsi per comprimere di nuovo.
Ovviamente, i dati sono compressi, ma viene poi trasmesso al wc
.
E 'la pena di provare, in ogni caso.
Modifica Quando ho cercato di creare un file di 5G con i dati da / dev / random ha prodotto un file 5G
di dimensioni 5,12 miliardi, anche se il mio file manager ha segnalato questo come 4,8 g
Poi ho compresso con gzip 5G
, il risultato 5G.gz
era la stessa dimensione (non molto la compressione di casuale di dati).
Poi zcat 5G.gz | wc -c
riferito lo stesso formato del file originale: 5120000000 byte. Quindi il mio suggerimento sembrava aver lavorato per questa prova, in ogni caso.
Grazie per l'attesa
gzip ha un opzione -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.