Wie wird die Komprimierungsstufe bei Verwendung von tar -zcvf angegeben?

142

Ich gzip-Verzeichnisse sehr oft bei der Arbeit. Was ich normalerweise mache, ist

tar -zcvf file.tar.gz /path/to/directory

Gibt es eine Möglichkeit, die Komprimierungsstufe hier anzugeben? Ich möchte die bestmögliche Komprimierung verwenden, auch wenn die Komprimierung länger dauert.

Laser
quelle

Antworten:

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

Angenommen, Sie verwenden Bash. Setzen Sie im Allgemeinen die Umgebungsvariable GZIP auf "-9" und führen Sie tar normal aus.

Außerdem: Wenn Sie wirklich die beste Komprimierung wünschen, verwenden Sie kein gzip. Verwenden Sie lzma oder 7z.

Und wenn Sie gzip verwenden (was aus verschiedenen Gründen eine gute Idee ist), ziehen Sie das pigzProgramm in Betracht und nicht das gzip.


quelle
14
pigz ist "paralleles gzip", bei dem alle Ihre Kerne für die Komprimierung von gzip verwendet werden. Sie können topes mit 200% -400 $ CPU ansehen und sehen.
Felipe Alvarez
2
Verwenden Sie für das .bz2-Format zu Ihrer Information: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi
3
Die Umgebungsvariable scheint nun zu sein GZIP_OPT, die Verwendung sollte gleich sein.
Seher
3
In der Manpage zu Ubuntu 16.04 für gzip: "Unter Vax / VMS lautet der Name der Umgebungsvariablen GZIP_OPT, um einen Konflikt mit dem für den Programmaufruf festgelegten Symbol zu vermeiden." Für sh, csh und MSDOS sollte es immer noch GZIP sein
Ponyboy47
68

Anstatt das gzip-Flag für tar zu verwenden, gzipen Sie die Dateien manuell nach dem tar-Prozess. Anschließend können Sie die Komprimierungsstufe für das gzip-Programm angeben:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Oder Sie könnten verwenden:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

Die -9 in der gzip-Befehlszeile weist gzip an, die maximal mögliche Komprimierungsstufe zu verwenden (Standard ist -6).

Bearbeiten: Pipe-Kommandozeile basierend auf @depesz-Kommentar korrigiert.

Matrix Mole
quelle
4
Die Verwendung von Pipes sollte erfolgen mit:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
Das erste Beispiel sollte mit enden file.tar, da gzipdie Erweiterung ".gz" hinzugefügt wird.
Bonsaiviking
4
warum gehst du nicht überspringen f -? Wenn es keine Datei gibt, ist es stdin / out
akostadinov
Ergänzung zum vorherigen Kommentar. Im Abschnitt "man tar" Umgebung: TAPE Gerät oder Datei, die für das Archiv verwendet werden sollen, wenn --file nicht angegeben ist. Wenn diese Umgebungsvariable nicht gesetzt ist, verwenden Sie stattdessen stdin oder stdout.
Mikl
2
und wir können "gzip -9 -" -> "gzip -9" reduzieren. Aus dem Abschnitt "man gzip" Beschreibung: Wenn keine Dateien angegeben sind oder ein Dateiname "-" lautet, wird die Standardeingabe auf die Standardausgabe komprimiert.
Mikl
53

Moderne Versionen von tar unterstützen das xz-Archivformat (GNU tar, seit 1.22 im Jahr 2009, Busybox seit 1.17.0 im Jahr 2010).

Es basiert auf lzma2 , eine Art 7-Zip- Version von gz . Dies bietet eine bessere Komprimierung, wenn Sie die Anforderung erfüllen, xz-Unterstützung zu benötigen.

tar -Jcvf file.tar.xz /path/to/directory

Ich habe gerade herausgefunden hier (im Grunde eine Betrogene dieser Frage, aber in dem Unix - Stack) , dass es auch ein XZ_OPT = -9 Umgebungsvariable die XZ Komprimierungsgrade ähnlich den GZIP eines in dem anderen Beitrag zu steuern.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
David C. Bishop
quelle
2
+1 xz ist weitaus besser als bzip2 und gzip. Hier ist ein Vergleich: tukaani.org/lzma/benchmarks.html
User1
8
Der Kompromiss ist Geschwindigkeit. XZ ist deutlich langsamer.
Bell
32
tar cv /path/to/directory | gzip --best > file.tar.gz

Dies ist die zweite Lösung von Matrix Mole, jedoch leicht verkürzt:

Wenn Sie tar aufrufen, gibt die Option an f, dass die Ausgabe eine Datei ist. Wenn Sie es auf -(stdout) setzen, schreibt tar seine Ausgabe auf stdout, was das Standardverhalten ohne beide fund ist -.

Und wie in der gzipManpage angegeben, wird gzip aus der Standardeingabe komprimiert, wenn keine Dateien angegeben sind. Es besteht keine Notwendigkeit für -den gzipAnruf.

Option --best(entspricht -9) legt die höchste Komprimierungsstufe fest.

carlito
quelle
1
Das funktioniert wunderbar. Auch wenn Sie als Root ausgeführt werden, bleiben Berechtigungen und Eigentümer erhalten. Andernfalls müssen Sie angeben. Auch wenn es nicht offensichtlich war, ist "-9" die beste Komprimierung und "-1" die schnellste Komprimierung. "-1" dauert noch lange, wenn Sie viele Dateien haben ;-)
PJ Brunet
Das funktioniert mit xzund pixzauch. Auf diese Weise können Sie die Anzahl der Threads steuern, die für die parallele Komprimierung verwendet werden, ohne eine dazwischen liegende TAR-Datei erstellen zu müssen. Wie sotar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

Es besteht auch die Möglichkeit, das Komprimierungsprogramm mit -I anzugeben. Dies kann die Option für die Komprimierungsstufe einschließen.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Chris Gibson
quelle
2
Ältere Versionen von tar, wie die in CentOS 6 & 7 bereitgestellten, unterstützen die Angabe von Argumenten in -Iarg nicht. Sie versuchen, das Ganze als Programmnamen für exec zu behandeln, und schlagen daher fehl. Zumindest ab Teer 1.29 in Debian Stretch funktioniert dies.
Cheetah
2

Und natürlich muss der von macOS bsd abgeleitete Teer anders sein:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
rfay
quelle