¿Por qué comprimir un archivo en stdin produce una salida más pequeña que el mismo archivo dado como argumento?

13

Cuando lo hago:

# gzip -c foo > foo1.gz 
# gzip < foo > foo2.gz

¿Por qué foo2.gztermina siendo más pequeño en tamaño que foo1.gz?

MichalH
fuente

Respuestas:

19

Porque está guardando el nombre de archivo y la marca de tiempo para que pueda intentar restaurar ambos después de descomprimirlo más tarde. Como foose da a gziptravés de via <stdin>en su segundo ejemplo, no puede almacenar el nombre de archivo y la información de la marca de tiempo.

Desde la página del manual:

   -n --no-name
          When compressing, do not save the original file name and time stamp by default. (The original name is always saved if the name had
          to  be truncated.) When decompressing, do not restore the original file name if present (remove only the gzip suffix from the com-
          pressed file name) and do not restore the original time stamp if present (copy it from the compressed file). This  option  is  the
          default when decompressing.

   -N --name
          When compressing, always save the original file name and time stamp; this is the default. When decompressing, restore the original
          file name and time stamp if present. This option is useful on systems which have a limit on file name  length  or  when  the  time
          stamp has been lost after a file transfer.

He recreado el problema aquí:

[root@xxx601 ~]# cat /etc/fstab > file.txt
[root@xxx601 ~]# gzip < file.txt > file.txt.gz
[root@xxx601 ~]# gzip -c file.txt > file2.txt.gz
[root@xxx601 ~]# ll -h file*
-rw-r--r--. 1 root root  465 May 17 19:35 file2.txt.gz
-rw-r--r--. 1 root root 1.2K May 17 19:34 file.txt
-rw-r--r--. 1 root root  456 May 17 19:34 file.txt.gz

En mi ejemplo, file.txt.gzes el equivalente de tu foo2.gz. El uso de la -nopción deshabilita este comportamiento cuando de otro modo tendría acceso a la información:

[root@xxx601 ~]# gzip -nc file.txt > file3.txt.gz
[root@xxx601 ~]# ll -h file*
-rw-r--r--. 1 root root  465 May 17 19:35 file2.txt.gz
-rw-r--r--. 1 root root  456 May 17 19:43 file3.txt.gz
-rw-r--r--. 1 root root 1.2K May 17 19:34 file.txt
-rw-r--r--. 1 root root  456 May 17 19:34 file.txt.gz

Como puede ver arriba, los tamaños de archivo file.txty file3.txtcoinciden ya que ahora ambos omiten nombre y fecha.

Bratchley
fuente