Come specificare il livello di compressione quando si usa tar -zcvf?


143

Gzip directory molto spesso al lavoro. Quello che faccio normalmente è

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

C'è un modo per specificare il livello di compressione qui? Voglio usare la migliore compressione possibile anche se ci vuole più tempo per comprimere.

Risposte:


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

supponendo che stai usando bash. In genere, impostare la variabile di ambiente GZIP su "-9" ed eseguire tar normalmente.

Inoltre, se vuoi davvero la migliore compressione, non usare gzip. Usa lzma o 7z.

E quando usi gzip (che è comunque una buona idea per vari motivi) considera di usare il pigzprogramma e non il gzip.


14
pigz è "gzip parallelo" che utilizza tutti i core per la compressione gzip. Puoi guardarlo tope vederlo usando ovunque tra il 200% -400 $ CPU.
Felipe Alvarez,

2
Cordiali saluti, per il formato .bz2, utilizzare: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi

3
La variabile d'ambiente sembra essere ora GZIP_OPT, l'uso dovrebbe essere lo stesso.
Visto il

3
Dalla pagina man su Ubuntu 16.04 per gzip: "Su Vax / VMS, il nome della variabile d'ambiente è GZIP_OPT, per evitare un conflitto con il set di simboli per l'invocazione del programma." Per sh, csh e MSDOS dovrebbe essere ancora GZIP
Ponyboy47

68

Invece di usare il flag gzip per tar, gzip i file manualmente dopo il processo tar, quindi puoi specificare il livello di compressione per il programma gzip:

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

Oppure potresti usare:

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

Il -9 nella riga di comando di gzip dice a gzip di usare il massimo livello di compressione possibile (il valore predefinito è -6).

Modifica: riga di comando della pipe fissa basata sul commento @depesz.


4
L'utilizzo delle pipe deve essere eseguito con:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
Il primo esempio dovrebbe finire con file.tar, poiché gzipaggiunge l'estensione ".gz".
bonsaiviking

4
perché non salti f -? se non ci sono file, allora è stdin / out
akostadinov

oltre al commento precedente. Dalla sezione "man tar" Ambiente: TAPE Dispositivo o file da utilizzare per l'archivio se --file non è specificato. Se questa variabile di ambiente non è impostata, utilizzare invece stdin o stdout.
Mikl,

2
e possiamo ridurre "gzip -9 -" -> "gzip -9". Dalla sezione "man gzip" Descrizione: Se non viene specificato alcun file o se il nome di un file è "-", l'input standard viene compresso nell'output standard.
Mikl,

53

Le versioni moderne di tar supportano il formato di archivio xz (GNU tar, dal 1.22 nel 2009, Busybox dal 1.17.0 nel 2010).

È basato su lzma2 , un po 'come una versione 7-zip di gz . Ciò fornisce una migliore compressione se si è d'accordo con il requisito di richiedere il supporto xz.

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

Ho appena scoperto qui (fondamentalmente un inganno di questa domanda, ma nello stackexchange di Unix) che esiste anche una variabile d'ambiente XZ_OPT = -9 per controllare il livello di compressione XZ simile a quello GZIP nell'altro post.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz è di gran lunga migliore di bzip2 e gzip. Ecco un confronto: tukaani.org/lzma/benchmarks.html
User1

8
Il compromesso è la velocità. XZ è significativamente più lento.
Bell,

32
tar cv /path/to/directory | gzip --best > file.tar.gz

Questa è la seconda soluzione di Matrix Mole, ma leggermente abbreviata:

Quando si chiama tar, l'opzione findica che l'output è un file. Impostandolo su -(stdout), tar scrive il suo output su stdout, che è il comportamento predefinito senza entrambi fe -.

E come affermato dalla gzippagina man, se non viene specificato alcun file gzip comprimerà dall'input standard. Non è necessario per -la gzipchiamata.

L'opzione --best(equivalente a -9) imposta il livello di compressione più alto.


1
Funziona magnificamente. Inoltre, se si esegue come root, anche le autorizzazioni e i proprietari vengono conservati. Altrimenti è necessario specificare. Inoltre, se non fosse ovvio, "-9" è la compressione migliore e "-1" è la compressione più veloce. "-1" richiede ancora molto tempo se hai molti file ;-)
PJ Brunet

Questo funziona con xze pixztroppo. È un ottimo modo per controllare il numero di thread utilizzati per la compressione parallela senza dover creare un file .tar intermedio. In questo modotar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom,

10

C'è anche l'opzione per specificare il programma di compressione usando -I. Ciò può includere l'opzione del livello di compressione.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
Versioni precedenti di tar come quella fornita in CentOS 6 e 7 non supportano la fornitura di argomenti nell'arg -I, cercheranno di trattare l'intera cosa come un nome di programma da eseguire, e quindi falliranno. Almeno dal tar 1.29 di Debian Stretch, questo funziona.
Ghepardo,

2

E ovviamente macOS derivato da bsd tar deve essere diverso:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.