Warum liefert das Komprimieren einer Datei unter stdin eine geringere Ausgabe als die als Argument angegebene Datei?

13

Wenn ich mache:

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

Warum wird foo2.gzes kleiner als foo1.gz?

MichalH
quelle

Antworten:

19

Weil der Dateiname und der Zeitstempel gespeichert werden, damit versucht werden kann, beide wiederherzustellen, nachdem Sie sie später dekomprimiert haben. Da in Ihrem zweiten Beispiel " via" fooangegeben ist , können die Informationen zu Dateiname und Zeitstempel nicht gespeichert werden.gzip<stdin>

Aus der Manpage:

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

Ich habe das Problem hier neu erstellt:

[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

In meinem Beispiel file.txt.gzist das Äquivalent von Ihrem foo2.gz. Die Verwendung von -nOption deaktiviert dieses Verhalten , wenn es anders wäre Zugang zu den Informationen haben:

[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

Wie Sie oben sehen können, stimmen die Dateigrößen für file.txtund file3.txtüberein, da jetzt sowohl Name als auch Datum weggelassen werden.

Bratchley
quelle