2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

Wie erreicht man maximale Kompression mit .tar.gz?

Die Art und Weise, wie ich die Verwendung von tar + gzip verstehe, ist, dass tar normalerweise verwendet wird, um eine Gruppierung von Dateien in eine einzige Datei zu konsolidieren, dann wird gzip verwendet, um diese Datei zu komprimieren.

Ich habe kürzlich gelernt, dass tar auch komprimieren kann.

Da ich nicht ganz verstehe, wie Komprimierung im Kern funktioniert, habe ich (möglicherweise lächerliche) Bedenken, daß das Senden einer vorkomprimierten .tar-Datei an gzip verhindern könnte, daß gzip so gut komprimiert, wie es sein Potential zuläßt, und dergleichen.

Meine Frage ist im Wesentlichen: Welche Kombination von Args/Komprimierungsmethoden sollte ich verwenden, um das absolut kleinste tar.gz zu erstellen, und wie sieht die Kommandozeilenanweisung dafür aus?

Antworten (4)

118
118
118
2013-01-31 18:55:22 +0000

Oder Sie können tar auf diese Weise anweisen, die maximale Komprimierung zu verwenden:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

Zusätzlich können Sie, um Ihre envvars übersichtlich zu halten, folgendes tun:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

Wie Sie sagten - “tar kann auch komprimieren”, impliziert, dass - tar Daten nicht _immer von sich aus komprimiert.

Es tut dies nur, wenn es mit der Option z verwendet wird. Auch das nicht von selbst, sondern - indem es die gepackten Daten durch gzip leitet.

Stattdessen können Sie jedoch, wie in dieser Antwort vermerkt, die beiden Befehle über die Pipeline leiten: tar & gzip, so dass Sie die Komprimierungsstufe für den Befehl gzip explizit angeben können, um die kleinste Ausgabegröße zu erreichen.

tar cvf - /pfad/zum/verzeichnis | gzip -9 - > datei.tar.gz

Hier gibt 9 die maximal mögliche Kompressionsstufe an.

17
17
17
2014-03-10 15:23:08 +0000

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.

6
6
6
2014-02-06 18:25:54 +0000
tar c /path/to/data | gzip --best > file.tar.gz

gzip Option --best (entspricht -9) fragt nach der höchsten Kompressionsstufe.