obtener el tamaño de archivo del archivo .gz muy grande en una plataforma de 64 bits
Pregunta
De acuerdo con la specifiction de gz el tamaño del archivo se guarda en los últimos 4bytes de un archivo .gz.
He creado 2 archivos con
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Yo les gziped
gzip 500M 5G
Comprobé los últimos 4 bytes que hacen
tail -c4 500M|od -I (returns 512000000 as expected)
tail -c4 5G|od -I (returns 825032704 as not expected)
Parece que golpear la barrera de 32 bits invisibles, hace que el valor escrito en el ISIZE completamente sin sentido. ¿Qué es más molesto, que si hubieran utilizado algún bit de error en su lugar.
¿Alguien sabe de una manera de conseguir el tamaño del archivo .gz sin comprimir desde la .gz sin extraerlo?
gracias
especificación: http://www.gzip.org/zlib/rfc-gzip. html
editar: si alguien para probarlo, se puede usar / dev / cero en lugar de / dev / urandom
Solución
No hay una sola.
La única manera de obtener el tamaño exacto de una corriente comprimida es ir realmente y descomprimirlo (incluso si se escribe todo a / dev / null y simplemente contar el bytes).
Vale la pena señalar que ISIZE se define como
ISIZE (tamaño de la entrada)
Este contiene el tamaño de la entrada original (sin comprimir)
modulo de datos 2 ^ 32.
RFC por lo que no es en realidad romper en la barrera de 32 bits, el comportamiento de lo que se está viendo que se espera.
Otros consejos
No he probado esto con un archivo del tamaño que usted ha mencionado, pero a menudo encontrar el sin comprimir tamaño de un archivo .gz con
zcat file.gz | wc -c
cuando no quiero dejar el archivo sin comprimir por ahí, o molestar a comprimirlo de nuevo.
Obviamente, los datos son sin comprimir, pero luego se canaliza a wc
.
Vale la pena intentarlo, al menos.
EDIT: Cuando intenté crear un archivo con datos de 5G / dev / random se produjo un 5G
archivo de tamaño 5120000000, aunque mi administrador de archivos informó esto como 4,8 g
Entonces Comprimí con gzip 5G
, los resultados 5G.gz
era el mismo tamaño (no mucho de compresión de azar datos).
A continuación, zcat 5G.gz | wc -c
informó del mismo tamaño que el archivo original: 5120000000 bytes. Así que mi sugerencia parecía haber trabajado para este ensayo, de todos modos.
Gracias por la espera
gzip tiene una opción -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.