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

Jak uzyskać maksymalną kompresję przy użyciu .tar.gz?

Sposób, w jaki rozumiem użycie tar + gzip jest taki, że tar jest zwykle używany do konsolidacji grupy plików w jeden plik, a następnie gzip jest używany do kompresji tego pliku.

Niedawno dowiedziałem się, że tar może również kompresować.

Ponieważ nie rozumiem w pełni, jak działa kompresja @ to’s core, mam (prawdopodobnie śmieszne) obawy, że wysłanie wstępnie skompresowanego .tar do gzip może uniemożliwić gzipowi kompresję tak dobrze, jak jego potencjał pozwoli i rzeczy tej natury.

Moje pytanie jest zasadniczo: Jakiej kombinacji argumentów / metod kompresji powinienem użyć, aby utworzyć absolutnie najmniejszy tar.gz, i jak wygląda deklaracja wiersza poleceń dla tego?

Odpowiedzi (4)

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

Możesz też powiedzieć tarowi, aby używał maksymalnej kompresji w ten sposób:

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

Dodatkowo, aby zachować porządek w swoich envvarach, możesz zrobić tak:

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

Jak stwierdziłeś - “tar może również kompresować”, implikuje, że - tar nie zawsze kompresuje dane samodzielnie.

Robi to tylko wtedy, gdy jest używane z opcją z. To też nie samo z siebie, ale - przepuszczając dane w smarze przez gzip.

Jednak zamiast tego, jak zauważono w tej odpowiedzi, możesz potokować te dwa polecenia: tar & gzip tak, że możesz jawnie określić poziom kompresji dla polecenia gzip, aby uzyskać najmniejszy rozmiar wyjściowy.

tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

Tutaj 9 określa maksymalny możliwy poziom kompresji.

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

Zazwyczaj ani gzip ani tar nie są w stanie utworzyć “absolutnie najmniejszego tar.gz”. Istnieje wiele narzędzi do kompresji, które potrafią skompresować do formatu gz. Napisałem skrypt basha gz99 “, który próbuje gzip, 7z i advdef aby uzyskać najmniejszy plik. Aby użyć tego do stworzenia najmniejszego możliwego pliku uruchom:

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

Narzędzie advdef z AdvanceCOMP zazwyczaj daje najmniejszy plik, ale jest również podatne na błędy (narzędzie gz99 sprawdza, czy nie uszkodziło pliku przed zaakceptowaniem wyjścia advdef). Aby użyć advdef bezpośrednio, utwórz plik.tar.gz jakkolwiek chcesz. Następnie uruchom:

advdef -z -4 file.tar.gz

Stworzy to standardowy plik gz, który może być odczytany przez gzip i tar jak zwykle, tylko trochę mniejszy. Jest to najlepsze, co można zrobić z formatem gz.

Ponieważ dopiero niedawno dowiedziałeś się, że tar potrafi kompresować, i nie powiedziałeś, dlaczego chcesz mieć najmniejszy plik ”.tar.gz", możesz nie wiedzieć, że istnieją bardziej wydajne formaty plików tar, takie jak xz. Ogólnie rzecz biorąc, przejście na inny format może dać znacznie lepszy efekt kompresji, niż bawienie się opcjami gzip. Główną wadą xz jest to, że nie jest on tak powszechny jak gzip, więc osoby, do których wysyłasz plik, mogą być zmuszone do zainstalowania nowego pakietu. Ma również tendencję do bycia nieco wolniejszym, szczególnie podczas kompresji. Jeśli to nie ma dla ciebie znaczenia i naprawdę chcesz mieć najmniejszy plik tar, spróbuj:

tar cv path/to/data | xz -9 > file.tar.xz

Nowoczesne wersje tar, na przykład na Ubuntu 13.10, automatycznie wykrywają skompresowane pliki. Więc nawet jeśli używasz kompresji xz, możesz dekompresować jak zwykle:

tar xvf file.tar.xz

Aby dać szybki pogląd na porównanie tych narzędzi do kompresji, rozważ efekt kompresji patch-3.1.1 z jądra linuxa:

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

W tym trywialnym przykładzie widzimy, że aby uzyskać najmniejszy gz potrzebujemy advdef (choć 7z -tgzip jest prawie tak samo dobry i o wiele mniej zabugowany). Widzimy również, że przejście na xz daje nam znacznie więcej miejsca niż próba wyciśnięcia jak najwięcej ze starego formatu gz, bez zbyt długiej kompresji.

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

gzip opcja --best (odpowiednik -9) pyta o najwyższy poziom kompresji.