Normalerweise können weder gzip noch tar “das absolut kleinste tar.gz” erzeugen. Es gibt viele Komprimierungsprogramme, die in das gz-Format komprimieren können. Ich habe ein Bash-Skript gz99 “ geschrieben, um gzip
, 7z
und advdef
zu versuchen, um die kleinste Datei zu erhalten. Um damit die kleinstmögliche Datei zu erzeugen, führen Sie aus:
tar c path/to/data | gz99 file.gz
Das Hilfsprogramm advdef
von AdvanceCOMP liefert normalerweise die kleinste Datei, ist aber auch fehlerhaft (das Hilfsprogramm gz99
prüft, ob es die Datei nicht beschädigt hat, bevor es die Ausgabe von advdef
akzeptiert). Um advdef
direkt zu verwenden, erstellen Sie file.tar.gz, wie immer Sie wollen. Führen Sie dann aus:
advdef -z -4 file.tar.gz
Dies wird eine Standard-gz-Datei erzeugen, die von gzip und tar wie üblich gelesen werden kann, nur ein klein wenig kleiner. Dies ist so ziemlich das Beste, was Sie mit dem gz-Format machen können.
Da Sie erst vor kurzem gelernt haben, dass tar komprimieren kann, und nicht gesagt haben, warum Sie die kleinste ”.tar.gz"-Datei haben wollen, ist Ihnen vielleicht nicht bewusst, dass es effizientere Formate gibt, die mit tar-Dateien verwendet werden können, wie z.B. xz. Im Allgemeinen kann der Wechsel zu einem anderen Format eine wesentlich bessere Komprimierung bewirken als das Herumfummeln an den gzip-Optionen. Der Hauptnachteil von xz ist, dass es nicht so weit verbreitet ist wie gzip, so dass die Leute, denen Sie die Datei schicken, möglicherweise ein neues Paket installieren müssen. Es neigt auch dazu, etwas langsamer zu sein, besonders beim Komprimieren. Wenn das für Sie keine Rolle spielt und Sie wirklich die kleinste tar-Datei wollen, versuchen Sie es:
tar cv path/to/data | xz -9 > file.tar.xz
Moderne Versionen von tar, zum Beispiel unter Ubuntu 13.10, erkennen komprimierte Dateien automatisch. Selbst wenn Sie also die xz-Komprimierung verwenden, können Sie immer noch wie gewohnt dekomprimieren:
tar xvf file.tar.xz
Um eine schnelle Vorstellung davon zu bekommen, wie diese Komprimierungsprogramme im Vergleich stehen, betrachten Sie den Effekt der Komprimierung von patch-3.1.1 aus dem Linux-Kernel:
utility cpu format size(bytes)
gzip -9 0.02s gz 105,628
advdef -2 0.07s gz 102,619
7z -mx=9 -tgzip 0.42s gz 102,297
advdef -3 0.55s gz 102,290
advdef -4 0.75s gz 101,956
xz -9 0.03s xz 91,064
xz -3e 0.15s xz 90,996
In diesem trivialen Beispiel sehen wir, dass wir advdef brauchen, um das kleinste gz zu erhalten (obwohl 7z -tgzip fast genauso gut und viel weniger fehlerhaft ist). Wir sehen auch, dass wir durch den Wechsel zu xz viel mehr Platz gewinnen, als wenn wir versuchen, das meiste aus dem alten gz-Format herauszuquetschen, ohne dass die Kompression zu lange dauert.