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

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top