Pourquoi gzipper un fichier sur stdin donne une sortie plus petite que le même fichier donné en argument?

13

Quand je fais:

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

Pourquoi foo2.gzfinit-il par être plus petit que foo1.gz?

MichalH
la source

Réponses:

19

Parce qu'il enregistre le nom de fichier et l'horodatage afin qu'il puisse essayer de restaurer les deux après l'avoir décompressé plus tard. Étant foodonné que est donné à gzipvia <stdin>dans votre deuxième exemple, il ne peut pas stocker le nom de fichier et les informations d'horodatage.

Depuis la page de manuel:

   -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.

J'ai recréé le problème ici:

[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

Dans mon exemple, file.txt.gzest l'équivalent de votre foo2.gz. L'utilisation de l' -noption désactive ce comportement lorsqu'il aurait autrement accès aux informations:

[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

Comme vous pouvez le voir ci-dessus, les tailles de fichier file.txtet file3.txtcorrespondent car elles omettent désormais le nom et la date.

Bratchley
la source