Wie erreiche ich mit .tar.gz die maximale Komprimierung? [Duplikat]


63

Diese Frage hat hier bereits eine Antwort:

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

Ich habe kürzlich erfahren, dass tarman das auch komprimieren kann.

Da ich die Funktionsweise der Komprimierung im Kern nicht vollständig verstehe, habe ich (möglicherweise lächerlich) Bedenken, dass das Senden eines vorkomprimierten .tar-Objekts an gzip die Komprimierung von gzip verhindern könnte, so gut es das Potenzial zulässt, und solche Dinge.

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


2
Durch das Komprimieren bereits komprimierter Dateien kann die Größe verringert oder das Archiv vergrößert werden. Es hängt alles von der Art der Daten und der verwendeten Komprimierung ab.
Keltari,

Was @Keltari gesagt hat. Die Komprimierungsraten und -verhältnisse hängen stark davon ab, was Sie komprimieren. Aus diesem Grund gibt es auch unterschiedliche Komprimierungsalgorithmen und -methoden.
music2myear

Antworten:


111

Oder Sie können tar so anweisen, die maximale Komprimierung des Benutzers vorzunehmen:

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

Um Ihre Envvars übersichtlich zu halten, können Sie außerdem Folgendes tun:

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

43

Wie Sie sagten - " tar kann auch komprimieren " impliziert, dass - Daten tarnicht immer von selbst komprimiert werden.

Dies geschieht nur bei Verwendung mit der zOption. Auch das nicht von alleine, sondern durch Weitergabe der geteerten Daten über gzip.

Stattdessen können Sie jedoch, wie in dieser Antwort angegeben, die beiden Befehle weiterleiten: tar& Damit gzipkönnen Sie die Komprimierungsstufe für den gzipBefehl explizit angeben , um die kleinste Ausgabegröße zu erzielen.

tar cvf - / pfad / zu / verzeichnis | gzip -9 -> file.tar.gz

Hier wird 9die maximal mögliche Komprimierungsstufe angegeben.


Ich hatte ein Problem, bei dem es nicht rekursiv ist, und beschwerte mich, dass es ein leeres Archiv sein wird, da der Befehl aufgeteilt ist. Es ist schwer zu finden, wie man richtig rekursiv erzwingt, da es bereits tar ist. MEIN SCHLECHTES, ich hatte es ab so falsch angegebentar -cvf /path
Brian Thomas

17

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 eine Bash - Skript „geschrieben gz99 “ , um zu versuchen gzip, 7zund advdefdie kleinste Datei zu erhalten. So erstellen Sie mit dieser Option den kleinstmöglichen Dateilauf:

tar c path/to/data | gz99 file.gz

Das advdefHilfsprogramm von AdvanceCOMP gibt normalerweise die kleinste Datei an, ist aber auch fehlerhaft (das gz99Hilfsprogramm überprüft, ob die Datei nicht beschädigt wurde, bevor die Ausgabe von akzeptiert wird advdef). Für die advdefdirekte Verwendung erstellen Sie file.tar.gz, wie Sie möchten. Dann renne:

advdef -z -4 file.tar.gz

Dadurch wird eine Standard-GZ-Datei erstellt, die von GZIP und TAR wie gewohnt gelesen werden kann und nur ein kleines bisschen kleiner ist. Dies ist ungefähr das Beste, was Sie mit dem gz-Format machen können.

Da Sie erst kürzlich erfahren haben, dass tar komprimiert werden kann, und nicht angegeben haben, warum Sie die kleinste ".tar.gz" -Datei haben möchten, wissen Sie möglicherweise nicht, dass mit tar-Dateien wie xz effizientere Formate verwendet werden können. Im Allgemeinen kann der Wechsel zu einem anderen Format die Komprimierung erheblich verbessern, als wenn Sie mit den gzip-Optionen herumspielen. Der Hauptnachteil von xz ist, dass es nicht so häufig ist wie gzip, sodass die Personen, an die Sie die Datei senden, möglicherweise ein neues Paket installieren müssen. Es ist auch etwas langsamer, insbesondere beim Komprimieren. Wenn Ihnen das egal ist und Sie wirklich die kleinste TAR-Datei wollen, versuchen Sie Folgendes:

 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 die xz-Komprimierung verwenden, können Sie sie wie gewohnt dekomprimieren:

 tar xvf file.tar.xz

Um einen kurzen Überblick über den Vergleich dieser Komprimierungsprogramme zu erhalten, 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 einfachen Beispiel sehen wir, dass wir advdef brauchen, um die kleinste gz zu erhalten (obwohl 7z -tgzip fast genauso gut und viel weniger fehlerhaft ist). Wir sehen auch, dass der Wechsel zu xz viel mehr Speicherplatz einnimmt als der Versuch, das alte gz-Format optimal zu nutzen, ohne dass die Komprimierung zu lange dauert.


Das OP fragte nach, wie die meiste Komprimierung für eine .tar.gz-Datei erzielt werden soll. Sie schlugen jedoch vor, eine .tar.xz-Datei zu erstellen. Sie beantworten eine andere Frage als die gestellte.
ChrisInEdmonton

Ah, ich verstehe, was du vorhast. advdef stürzt nur auf meinem System ab (v1.15), daher funktioniert 'advdef -z -4 file.tar.gz' nicht, aber es könnte zumindest theoretisch funktionieren. Ich kann keine Beweise dafür finden, dass die Datei weiter verkleinert wird als 'gzip -9', aber es könnte sein, und auf jeden Fall reicht es aus, wenn ich meine -1-Stimme entferne. Danke fürs klarstellen!
ChrisInEdmonton

Hmm, ich benutze v1.17. Wie auch immer, der pedantische Mathematiker in mir möchte darauf hinweisen, dass meine Antwort wohl technisch nicht korrekt ist. Wenn Sie alle möglichen gz-Dateien von der kürzesten zur längsten auflisten und die erste auswählen, die in die richtige Datei dekomprimiert wird, können Sie noch ein paar Bytes mehr sparen. Aber das wäre in der Praxis viel zu langsam.
Samstag,

Ich denke nicht, dass "Buggy" und "Archiv" zusammen verwendet werden sollten. Was nützt ein beschädigtes Archiv? Sie benötigen eine viel größere Datei , um die Komprimierungsprogramme auf „Vergleichen“, und verschiedene Arten von Eingabedateien auch - in Hundertstelsekunden Unterscheidet Messung ist nicht so zuverlässig, ich denke , xz -9dauert in der Regel etwas wie 5x die gz -9Zeit, nicht nur 1,5x als Ihr Tisch schlägt vor.
Xen2050

Wie können wir geteilte Archive (während des Komprimierens) mit dem xz-Prozess
erstellen?

6
tar c /path/to/data | gzip --best > file.tar.gz

gzipOption --best(entspricht -9) fragt nach der höchsten Komprimierungsstufe.


4
Alternativ können Sie --bestflag: -9 verwenden, was für den Leser verwirrend ist.
om-nom-nom
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.