Jak uzyskać maksymalną kompresję z .tar.gz? [duplikować]

63

To pytanie ma już odpowiedź tutaj:

Sposób, w jaki rozumiem użycie tar + gzip, tarjest zwykle używany do konsolidacji grupy plików w jednym pliku, a następnie gzipsłuży do kompresji tego pliku.

Niedawno dowiedziałem się, że tarmożna również kompresować.

Ponieważ nie do końca rozumiem, jak działa kompresja @ jest to rdzeń, mam (prawdopodobnie absurdalne) obawy, że wysłanie wstępnie skompresowanego pliku .tar do gzip może uniemożliwić kompresowanie gzip, na ile pozwala na to jego potencjał i inne tego rodzaju rzeczy.

Moje pytanie brzmi w zasadzie: jakiej kombinacji metod args / kompresji należy użyć, aby utworzyć absolutnie najmniejszy plik tar.gz i jak to wygląda w wierszu poleceń?

Mario Zigliotto
źródło
2
Kompresowanie już skompresowanych plików może zmniejszyć ich rozmiar lub powiększyć archiwum. Wszystko zależy od rodzaju danych i zastosowanej kompresji.
Keltari
Co powiedział @Keltari. Współczynniki i współczynniki kompresji są silnie zależne od tego, co kompresujesz, dlatego też istnieją różne algorytmy i metody kompresji.
music2myear

Odpowiedzi:

111

Możesz też powiedzieć tarowi maksymalną kompresję użytkownika w ten sposób:

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

Dodatkowo, aby utrzymać porządek w envvars, możesz to zrobić:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Brian Fane
źródło
43

Jak powiedziałeś - „ tar może również kompresować ”, oznacza to, że - tarnie zawsze sam kompresuje dane.

Robi to tylko wtedy, gdy jest używane z tą zopcją. To też nie samo w sobie, ale - przekazując smołowane dane przez gzip.

Jednak zamiast tego, jak zauważono w tej odpowiedzi, możesz potokować dwa polecenia: tari gziptak, że możesz jawnie określić poziom kompresji dla gzippolecenia, aby osiągnąć najmniejszy rozmiar wyjściowy.

tar cvf - / ścieżka / do / katalogu | gzip -9 -> plik.tar.gz

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

Ujjwal Singh
źródło
Miałem problem polegający na tym, że nie jest rekurencyjny i narzeka, że ​​będzie to puste archiwum, ponieważ polecenie jest podzielone, ciężko jest znaleźć, jak prawidłowo wymusić rekurencję, ponieważ jest już domyślną opcją tar. MOJE ZŁE, niepoprawnie sprecyzowałem, że zaczyna się taktar -cvf /path
Brian Thomas
17

Zwykle ani gzip, ani tar nie mogą stworzyć „absolutnie najmniejszego tar.gz”. Istnieje wiele narzędzi do kompresji, które można skompresować do formatu gz. Napisałem skrypt bash „ gz99 ”, aby spróbować gzip, 7zi advdefaby uzyskać najmniejszy plik. Aby użyć tego do utworzenia najmniejszego możliwego uruchomienia pliku:

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

advdefNarzędziowy z AdvanceCOMP zwykle daje najmniejszy plik, ale jest również wózek spacerowy (te gz99kontrole narzędzie, które nie uszkodzony plik przed zaakceptowaniem wyjście advdef). Aby użyć advdefbezpośrednio, utwórz plik.tar.gz, jak chcesz. Następnie uruchomić:

advdef -z -4 file.tar.gz

Spowoduje to utworzenie standardowego pliku gz, który może być odczytany przez gzip i tar jak zwykle, tylko trochę mniejszy. To jest najlepsze, co możesz zrobić z formatem gz.

Ponieważ dopiero niedawno dowiedziałeś się, że tar może się kompresować, i nie powiedziałeś, dlaczego chcesz mieć najmniejszy plik „.tar.gz”, możesz nie wiedzieć, że z plikami tar można korzystać bardziej wydajnych formatów, takich jak xz. Ogólnie rzecz biorąc, przejście na inny format może dać znacznie lepszą poprawę kompresji niż kręcenie się z opcjami gzip. Główną wadą xz jest to, że nie jest tak powszechny jak gzip, więc osoby, do których wysyłasz plik, mogą potrzebować zainstalować nowy pakiet. Jest również nieco wolniejszy, szczególnie podczas kompresji. Jeśli nie ma to dla Ciebie znaczenia i naprawdę potrzebujesz najmniejszego pliku 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, nadal możesz dekompresować jak zwykle:

 tar xvf file.tar.xz

Aby szybko zorientować się, jak porównywane są te narzędzia do kompresji, rozważ efekt kompresji poprawki 3.1.1 z jądra systemu Linux:

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 (chociaż 7z -tgzip jest prawie tak samo dobry i znacznie mniej wadliwy). 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 kompresji trwającej zbyt długo.

gmatht
źródło
OP poprosił o jak najlepszą kompresję pliku .tar.gz, ale zasugerowałeś utworzenie pliku .tar.xz. Odpowiadasz na inne pytanie niż zadane.
ChrisInEdmonton,
Ach, rozumiem do czego zmierzasz. advdef po prostu ulega awarii w moim systemie (v1.15), więc 'advdef -z -4 file.tar.gz' nie działa, ale przynajmniej teoretycznie może. Nie mogę znaleźć dowodów na to, że zmniejszyłoby to plik bardziej niż „gzip -9”, ale może, a w każdym razie wystarczy mi usunąć głos -1. Dzięki za wytłumaczenie!
ChrisInEdmonton,
Hmm, używam v1.17. W każdym razie pedantyczny matematyk we mnie chce zauważyć, że moja odpowiedź prawdopodobnie nie jest poprawna technicznie. W końcu, jeśli wyliczysz wszystkie możliwe pliki gz od najkrótszego do najdłuższego i wybierzesz pierwszy, który rozpakuje się do właściwego pliku, możesz zgolić jeszcze kilka bajtów. Ale w praktyce byłoby to zbyt wolne.
gmatht
Nie sądzę, że „buggy” i „archiwum” powinny być kiedykolwiek używane razem, jaki użytek to archiwum, które jest uszkodzone? Potrzebujesz dużo większego pliku, aby „porównać” narzędzia kompresji, a także różnych typów plików wejściowych - pomiar w setnych częściach sekundy nie jest tak niezawodny, myślę, że xz -9zwykle zajmuje to około 5 razy więcej gz -9czasu, a nie tylko 1,5 razy więcej niż twój stół sugeruje.
Xen2050,
jak możemy tworzyć dzielone archiwa (podczas kompresji) przy użyciu procesu xz, proszę
nyxee
6
tar c /path/to/data | gzip --best > file.tar.gz

gzipopcja --best(odpowiednik -9) prosi o najwyższy poziom kompresji.

Carlito
źródło
4
Alternatywnie, użyj --bestflagi: -9 jest mylące dla czytelnika.
om-nom-nom