Jak określić poziom kompresji podczas korzystania z tar -zcvf?

142

Często gzipuję katalogi w pracy. Zwykle robię to

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

Czy jest tutaj sposób na określenie poziomu kompresji? Chcę użyć najlepszej możliwej kompresji, nawet jeśli kompresja zajmuje więcej czasu.

Lazer
źródło

Odpowiedzi:

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

zakładając, że używasz bash. Zasadniczo ustaw zmienną środowiskową GZIP na „-9” i uruchom normalnie tar.

Ponadto - jeśli naprawdę chcesz najlepszej kompresji, nie używaj gzip. Użyj lzma lub 7z.

A gdy używasz gzip (co jest dobrym pomysłem z różnych powodów), rozważ użycie pigzprogramu, a nie gzip.


źródło
14
pigz to „równoległy gzip”, który używa wszystkich rdzeni do kompresji gzip. Możesz go obejrzeć topi zobaczyć, używając procesora w przedziale 200% -400 $.
Felipe Alvarez,
2
Do twojej wiadomości., Dla formatu .bz2, użyj: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi
3
Wydaje się, że zmienna środowiskowa jest teraz GZIP_OPT, użycie powinno być takie samo.
Widzący
3
Ze strony podręcznika systemu Ubuntu 16.04 dla gzip: „W Vax / VMS nazwa zmiennej środowiskowej to GZIP_OPT, aby uniknąć konfliktu z zestawem symboli do wywołania programu”. Dla sh, csh i MSDOS powinno to być po prostu GZIP
Ponyboy47
68

Zamiast używać flagi gzip dla tar, gzip pliki ręcznie po procesie tar, a następnie możesz określić poziom kompresji dla programu gzip:

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

Lub możesz użyć:

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

-9 w linii poleceń gzip mówi gzip, aby użył maksymalnego możliwego poziomu kompresji (domyślnie jest to -6).

Edycja: Naprawiono wiersz poleceń potoku na podstawie komentarza @depesz.

Matrix Mole
źródło
4
Używanie rur powinno odbywać się za pomocą:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
Pierwszy przykład powinien kończyć się file.tar, ponieważ gzipdodaje rozszerzenie „.gz”.
bonsaiviking
4
dlaczego nie przeskakujesz f -? jeśli nie ma pliku, to jest stdin / out
akostadinov,
dodatek do poprzedniego komentarza. Z sekcji „man tar” Środowisko: TAPE Urządzenie lub plik do użycia w archiwum, jeśli nie podano opcji --file. Jeśli ta zmienna środowiskowa nie jest ustawiona, użyj zamiast niej stdin lub stdout.
Mikl
2
i możemy zmniejszyć „gzip -9 -” -> „gzip -9”. Z sekcji „man gzip” Opis: Jeśli nie określono żadnych plików lub nazwa pliku to „-”, standardowe wejście jest kompresowane do standardowego wyjścia.
Mikl
53

Nowoczesne wersje tar obsługują format archiwum xz (tar GNU, od 1.22 w 2009, Busybox od 1.17.0 w 2010).

Opiera się na lzma2 , trochę jak wersja 7-Zip gz . Daje to lepszą kompresję, jeśli jesteś w porządku z wymogiem konieczności obsługi xz.

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

Właśnie się tutaj dowiedziałem (w zasadzie duplikat tego pytania, ale w wymianie stosu Uniksa), że istnieje również zmienna środowiskowa XZ_OPT = -9 do kontrolowania poziomu kompresji XZ podobnego do GZIP jeden w drugim poście.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
David C. Bishop
źródło
2
+1 xz jest znacznie lepszy niż zarówno bzip2, jak i gzip. Oto porównanie: tukaani.org/lzma/benchmarks.html
Użytkownik1
8
Kompromisem jest prędkość. XZ jest znacznie wolniejszy.
Bell
32
tar cv /path/to/directory | gzip --best > file.tar.gz

To drugie rozwiązanie Matrix Mole, ale nieco skrócone:

Podczas wywoływania tar opcja fokreśla, że ​​wynikiem jest plik. Ustawienie go na -(stdout) powoduje, że tar zapisuje dane wyjściowe na stdout, co jest domyślnym zachowaniem bez obu fi -.

Jak podano na gzipstronie podręcznika , jeśli nie określono żadnych plików, gzip skompresuje się ze standardowego wejścia. Nie ma potrzeby -na gzipwezwanie.

Opcja --best(odpowiednik -9) ustawia najwyższy poziom kompresji.

Carlito
źródło
1
To działa pięknie. Również jeśli działasz jako root, uprawnienia i właściciele również zostaną zachowane. W przeciwnym razie musisz określić. Także jeśli nie było oczywiste, „-9” to najlepsza kompresja, a „-1” to najszybsza kompresja. „-1” wciąż trwa długo, jeśli masz dużo plików ;-)
PJ Brunet,
To działa z xzi pixzrównież. Jest to świetny sposób na kontrolowanie liczby wątków używanych do kompresji równoległej bez konieczności tworzenia pośredniego pliku .tar. W ten sposóbtar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

Istnieje również opcja określenia programu kompresji za pomocą -I. Może to obejmować opcję poziomu kompresji.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Chris Gibson
źródło
2
Starsze wersje tar, takie jak podane w CentOS 6 i 7, nie obsługują dostarczania argumentów w -Iarg, będą próbować traktować całość jako nazwę programu do wykonania, a zatem nie powiedzie się. Działa to przynajmniej od wersji tar 1.29 w wersji Debian Stretch.
Gepard
2

I oczywiście tar tar macOS pochodzący z bsd musi być inny:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
rfay
źródło