bzip2(1)

NAZWA
bzip2, bunzip2 - sortujący bloki kompresor/dekompresor plików, v1.0.8
bzcat - dekompresuje pliki na standardowe wyjście
bzip2recover - odzyskuje dane z uszkodzonych plików bzip2

SKŁADNIA
bzip2 [-cdfkqstvzVL123456789] [nazwy_plików...]
bunzip2 [ -fkvsVL ] [nazwy_plików...]
bzcat [ -s ] [nazwy_plików...]
bzip2recover nazwa_pliku

OPIS
bzip2 kompresuje pliki przy użyciu algorytmu sortowania bloków Burrowsa-Wheelera i kodu Huffmana. Kompresja jest generalnie sporo lepsza od konwencjonalnych kompresorów opartych o metodę LZ77/LZ78 i jest porównywalna z osiągnięciami statystycznych kompresorów z rodziny PPM. Opcje wiersza poleceń są w większości bardzo podobne do tych z GNU gzip, ale nie są identyczne. bzip2 oczekuje listy plików towarzyszących parametrom wiersza poleceń. Każdy plik jest zastępowany przez swoją skompresowaną wersję, z nazwą "oryginalny_plik.bz2". Każdy skompresowany plik ma ten sam czas modyfikacji, uprawnienia i, jeśli to możliwe, właściciela, co oryginał, po to, aby te ustawienia mogły zostać odtworzone podczas dekompresji. Utrzymywanie nazwy plików nie jest do końca dokładne w tym sensie, że nie ma możliwości przetrzymywania daty, uprawnień, właściciela i nazw plików na systemach, na których brakuje tych możliwości lub mają ograniczenia co do długości nazwy, takich jak np. MS-DOS. bzip2 i bunzip2 standardowo nie nadpisują istniejących już plików. Aby to robiły, trzeba użyć parametru -f. Jeśli nie podano żadnej nazwy pliku, bzip2 kompresuje ze standardowego wejścia na standardowe wyjście. Odmawia wówczas wypisywania skompresowanego wyjścia na terminal, gdyż byłoby to całkiem niezrozumiałe i przez to bez większego sensu. bunzip2 (lub bzip2 -d) dekompresuje wszystkie podane pliki. Pliki, które nie były utworzone przez bzip2, zostaną wykryte i zignorowane, a na ekranie pojawi się komunikat ostrzegawczy. bzip2 próbuje zgadnąć nazwę dla dekompresowanego pliku w następujący sposób:
       nazwa_pliku.bz2 staje się nazwa_pliku
       nazwa_pliku.bz staje się nazwa_pliku
       nazwa_pliku.tbz2 staje się nazwa_pliku.tar
       nazwa_pliku.tbz staje się nazwa_pliku.tar
       inna_nazwa      staje się   inna_nazwa.out
Jeśli plik nie ma jednego z następujących rozpoznawalnych rozszerzeń: .bz2, .bz, .tbz2 lub .tbz, to bzip2 napisze, że nie może zgadnąć nazwy pierwotnego pliku, i użyje oryginalnej nazwy z dodanym rozszerzeniem .out. Tak jak w przypadku kompresji, niepodanie żadnych nazw plików powoduje dekompresję ze standardowego wejścia na standardowe wyjście. bunzip2 poprawnie zdekompresuje plik, który jest połączeniem dwóch lub więcej skompresowanych plików. Rezultatem jest połączenie odpowiednich nieskompresowanych plików. Obsługiwane jest również sprawdzanie spójności (-t) połączonych skompresowanych plików. Można również kompresować lub dekompresować pliki na standardowe wyjście używając parametru -c. W ten właśnie sposób można przeprowadzać kompresję wielu plików równocześnie. Powstałe wyniki są przesyłane sekwencyjnie na standardowe wyjście. W ten sposób kompresja wielu plików generuje strumień zawierający reprezentacje kilku skompresowanych plików. Taki strumień może być zdekompresowany poprawnie tylko przez bzip2 w wersji 0.9.0 lub późniejszej. Wcześniejsze wersje bzip2 zatrzymają się po zdekompresowaniu pierwszego pliku w strumieniu. bzcat (lub bzip2 -dc) dekompresuje wszystkie wybrane pliki na standardowe wyjście. bzip2 czyta argumenty ze zmiennych środowiskowych BZIP2 i BZIP, w podanej kolejności, i przetwarza je przed jakimikolwiek argumentami przeczytanymi z linii poleceń. To dobra metoda na specyfikowanie standardowych ustawień. Kompresja stosowana jest zawsze, nawet jeśli skompresowany plik jest nieco większy od pliku oryginalnego. Pliki mniejsze niż około sto bajtów stają się większe, ponieważ mechanizm kompresji ma stały nagłówek wynoszący mniej więcej 50 bajtów. Przypadkowe dane (włączając wyjście większości kompresorów plików) są kodowane na mniej więcej 8,05 bitów na bajt, zwiększając plik o około 0,5%. Jako dodatkowe zabezpieczenie bzip2 używa 32-bitowych CRC, aby upewnić się, że zdekompresowana wersja pliku jest identyczna z oryginalną. To strzeże przed stratami w skompresowanych danych i przed niewykrytymi błędami w bzip2 (na szczęście bardzo rzadkich). Możliwość niewykrycia utraty danych jest mikroskopijna, mniej więcej jedna szansa na cztery miliardy dla każdego pliku. Trzeba jednak uważać, gdyż sprawdzenie jest dokonywane przed dekompresją, więc program poinformuje tylko o tym, że coś jest nie w porządku. Nie pomoże to odzyskać oryginalnych nieskompresowanych danych. Można użyć bzip2recover, aby spróbować odzyskać dane z uszkodzonych plików. Zwracane wartości: 0 dla normalnego wyjścia, 1 dla problemów technicznych (plik nieznaleziony, niewłaściwy parametr, błąd wejścia/wyjścia itp.), 2 dla zasygnalizowania błędu skompresowanego pliku, 3 dla wewnętrznego błędu (np. bug), który zmusił bzip2 do przerwania.

OPCJE

-c --stdout
    Kompresuje lub dekompresuje na standardowe wyjście.

-d --decompress
    Wymusza dekompresję. bzip2, bunzip2 i bzcat są tak naprawdę tymi samymi programami i decyzja o tym, jakie akcje będą wykonane, jest podejmowana na podstawie nazwy, jaka została użyta. Ten parametr ma wyższy priorytet i wymusza na bzip2 dekompresję.

-z --compress
    Podobne do -d: wymusza kompresję, bez względu na sposób wywołania.

-t --test
    Sprawdza integralność wybranego pliku/plików, ale nie dekompresuje ich. Wymusza to próbną dekompresję i mówi, jaki jest rezultat.

-f --force
    Wymusza zastępowanie plików wyjściowych. Normalnie bzip2 nie zastępuje istniejących plików wyjściowych. Flaga ta wymusza również na bzip2 łamanie dowiązań twardych, czego normalnie nie robi. bzip2 normalnie odmawia dekompresji plików, które nie mają poprawnych magicznych bajtów nagłówka. Jeśli jednak nastąpi wymuszenie (opcja -f), przetworzy takie pliki niezmodyfikowane. Jest to zachowanie typowe dla GNU gzip.

-k --keep
    Zachowuje (nie usuwa) pliki wejściowe przy kompresji lub dekompresji.

-s --small
    Redukuje użycie pamięci na kompresję, dekompresję i testowanie. Pliki są dekompresowane i testowane przy użyciu zmodyfikowanego algorytmu, który potrzebuje tylko 2,5 bajta na blok bajtów. Oznacza to, że każdy plik może być zdekompresowany przy użyciu około 2300k pamięci, jednak przy szybkości o około połowę mniejszej niż normalnie. Podczas kompresji -s wybiera bloki wielkości 200k, których limity pamięci wynoszą mniej więcej tyle samo, w zamian za jakość kompresji. W skrócie, jeśli komputer ma mało pamięci (8 megabajtów lub mniej), należy używać opcji -s do wszystkiego. Zobacz ZARZĄDZANIE PAMIĘCIĄ poniżej.

-q --quiet
    Wyłącza wszystkie nieistotne komunikaty ostrzegawcze. Nie są eliminowane komunikaty dotyczące błędów wejścia/wyjścia i innych zdarzeń krytycznych.

-v --verbose
    Tryb szczegółowy -- pokazuje stopień kompresji dla każdego pliku. Następne -v zwiększają stopień szczegółowości, powodując wyświetlanie dużej ilości informacji, przydatnych głównie przy diagnostyce.

-L --license -V --version
    Wyświetla wersję programu i warunki licencji.

-1 (lub --fast) do -9 (lub --best)
    Ustawia wielkość bloku podczas kompresji na 100 k, 200 k .. 900 k. Nie ma żadnego znaczenia przy dekompresji. Zobacz ZARZĄDZANIE PAMIĘCIĄ poniżej. Aliasy --fast i --best zostały dodane głównie dla zgodności z GNU gzip. W szczególności --fast niczego znacząco nie przyspiesza. Natomiast --best zaledwie powoduje wybór zachowania domyślnego.

--  Traktuje wszystkie następujące po nim argumenty jako nazwy plików, nawet jeśli zaczynają się one od łącznika. Możesz więc kompresować i dekompresować pliki, których nazwa zaczyna się od łącznika, na przykład: bzip2 -- -mój_plik.

--repetitive-fast --repetitive-best
    Te parametry nie mają znaczenia w wersjach 0.9.5 i wyższych. Umożliwiały one pewną infantylną kontrolę nad zachowaniem algorytmu sortującego we wcześniejszych wersjach, co było czasami użyteczne. Wersje 0.9.5 i wyższe mają usprawniony algorytm, który powoduje bezużyteczność tej funkcji.

ZARZĄDZANIE PAMIĘCIĄ
bzip2 kompresuje duże pliki w blokach. Rozmiar bloku ma wpływ zarówno na stopień osiąganej kompresji, jak i na ilość pamięci potrzebnej do kompresji i dekompresji. Parametry od -1 do -9 wybierają rozmiar bloku odpowiednio od 100.000 bajtów aż do 900.000 bajtów (standardowo). W czasie dekompresji rozmiar bloku użytego do kompresji jest odczytywany z nagłówka pliku skompresowanego, następnie bunzip2 sam zajmuje odpowiednią do dekompresji ilość pamięci. Ponieważ rozmiar bloków jest przetrzymywany w pliku skompresowanym, parametry od -1 do -9 nie mają przy dekompresji żadnego znaczenia. Wymagania kompresji i dekompresji (w bajtach) można oszacować następująco:
       Kompresja: 400k + (8 * rozmiar bloku)
       Dekompresja: 100k + (4 * rozmiar bloku) lub
                      100k + (2,5 * rozmiar bloku) Większe bloki dają duże zmniejszenie zwrotów marginalnych. Większość kompresji pochodzi z pierwszych stu lub dwustu kilobajtów rozmiaru bloku. Warto o tym pamiętać, używając bzip2 na wolnych komputerach. Warto również podkreślić, że rozmiar pamięci potrzebnej do dekompresji jest wybierany poprzez ustawienie odpowiedniej wielkości bloku przy kompresji. Dla plików skompresowanych standardowym blokiem wielkości 900k bunzip2 będzie wymagał około 3700 kilobajtów do dekompresji. Aby umożliwić dekompresję na komputerze wyposażonym jedynie w 4 megabajty pamięci, bunzip2 ma opcję, która może zmniejszyć wymagania prawie do połowy, tzn. około 2300 kilobajtów. Prędkość dekompresji jest również bardzo zmniejszona, więc należy używać tej opcji tylko wtedy, kiedy jest to konieczne. Tym parametrem jest -s. Generalnie należy próbować i używać największych rozmiarów bloków, jeśli ilość pamięci na to pozwala. Prędkość kompresji i dekompresji w zasadzie nie zależy od wielkości użytego bloku. Inna ważna rzecz dotyczy plików, które mieszczą się w pojedynczym bloku - czyli większości plików, na które się można natknąć, używając dużych bloków. Rozmiar realny zabieranej pamięci jest proporcjonalny do wielkości pliku, ponieważ plik jest mniejszy niż blok. Na przykład kompresja pliku o wielkości 20.000 bajtów z parametrem -9 wymusi na kompresorze odnalezienie 7600k pamięci, ale zajęcie tylko 400k + 20000 * 8 = 560 kilobajtów z tego. Podobnie, dekompresor odnajdzie 3700k, ale zajmie tylko 100k + 20000 * 4 = 180 kilobajtów. Oto tabela, która podsumowuje maksymalne użycie pamięci dla różnych rozmiarów bloków. Podano też całkowity rozmiar skompresowanych 14 plików tekstowych ("Calgary Text Compression Corpus") zajmujących razem 3.141.622 bajtów. Ta kolumna daje pewne pojęcie o tym, jaki wpływ na kompresję ma wielkość bloków. Wartości te zaniżają jednak korzyści wynikające z użycia większych bloków dla większych plików, ponieważ "Corpus" jest zdominowany przez mniejsze pliki.
             Użycie Użycie Użycie Rozmiar
   Parametr kompresji dekompresji dekompresji -s "Corpusu"
     -1 1200k 500k 350k 914704
     -2 2000k 900k 600k 877703
     -3 2800k 1300k 850k 860338
     -4 3600k 1700k 1100k 846899
     -5 4400k 2100k 1350k 845160
     -6 5200k 2500k 1600k 838626
     -7 6100k 2900k 1850k 834096
     -8 6800k 3300k 2100k 828642
     -9 7600k 3700k 2350k 828642

ODZYSKIWANIE DANYCH ZE ZNISZCZONYCH PLIKÓW BZIP2
bzip2 kompresuje pliki w blokach, zazwyczaj 900-kilobajtowych. Każdy blok jest przetwarzany niezależnie. Jeśli błędy transmisji lub nośnika uszkodzą wieloblokowy plik .bz2, możliwe jest odtworzenie danych zawartych w niezniszczonych blokach pliku. Skompresowana reprezentacja każdego bloku jest oznaczona przez 48-bitowy wzorzec, który umożliwia znajdowanie granic bloków z rozsądną pewnością. Każdy blok ma również swój 32-bitowy CRC, więc bloki uszkodzone mogą być łatwo odróżnione od poprawnych. bzip2recover jest oddzielnym programem, którego zadaniem jest poszukiwanie bloków w plikach .bz2 i zapisywanie ich do własnego pliku .bz2. Można potem użyć bzip2 -t, aby sprawdzić spójność wyjściowych plików i zdekompresować te, które nie są uszkodzone. bzip2recover pobiera pojedynczy argument - nazwę uszkodzonego pliku, i tworzy pewną liczbę plików "rec0001plik.bz2", "rec0002plik.bz2" itd., przetrzymujących odzyskane bloki. Wyjściowe nazwy plików są tworzone tak, by łatwo było potem używać ich razem za pomocą gwiazdek - na przykład "bzip2 -dc rec*plik.bz2 > odzyskany_plik" przetworzy pliki we właściwej kolejności. bzip2recover powinien być używany najczęściej z dużymi plikami .bz2, jako iż właśnie one zawierają najczęściej dużo bloków. Jest czystym bezsensem używać go na uszkodzonym jednoblokowym pliku, ponieważ uszkodzony blok nie może być odzyskany. W celu zminimalizowania jakichkolwiek możliwych strat danych poprzez nośnik lub transmisję należy zastanowić się nad użyciem mniejszych bloków.

UWAGI DOTYCZĄCE WYDAJNOŚCI
Etap sortujący kompresji gromadzi podobne ciągi znaków w pliku. Przez to pliki zawierające bardzo długie ciągi powtarzających się symboli, jak "aabaabaabaab..." (powtórzone kilkaset razy), mogą być kompresowane wolniej niż normalnie. Wersje 0.9.5 i wyższe zachowują się dużo lepiej w tej sytuacji niż wersje poprzednie. Różnica stopnia kompresji pomiędzy najgorszym a najlepszym przypadkiem kompresji wynosi około 10:1. Dla wcześniejszych wersji było to nawet około 100:1. Aby monitorować postępy bardzo szczegółowo, można użyć parametru -vvvv. Szybkość dekompresji nie jest zmieniana przez te zjawiska. bzip2 zazwyczaj rezerwuje kilka megabajtów pamięci do działania, a potem wykorzystuje ją w dość przypadkowy sposób. Oznacza to, że szybkość zarówno kompresji, jak i dekompresji jest w dużej części zależna od szybkości, z jaką komputer użytkownika może obsłużyć chybienia bufora podręcznego. Z tego powodu wprowadzone zostały małe zmiany kodu, aby zmniejszyć współczynnik chybień, które dały nieproporcjonalnie duży wzrost osiągnięć. bzip2 prawdopodobnie będzie działał najlepiej na komputerach z bardzo dużymi buforami podręcznymi.

ZASTRZEŻENIA
Wiadomości o błędach wejścia/wyjścia nie są aż tak pomocne, jak mogłyby być. bzip2 stara się wykryć błąd wejścia/wyjścia i wyjść "czysto", ale szczegóły tego, jaki to problem, mogą być czasami bardzo mylące. Ta strona podręcznika odnosi się do wersji 1.0.8 programu bzip2. Skompresowane pliki utworzone przez tę wersję są kompatybilne zarówno w przód, jak i wstecznie z poprzednimi publicznymi wydaniami, wersjami 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 i wyższymi, ale z jednym wyjątkiem: 0.9.0 i wyższe potrafią poprawnie dekompresować wiele skompresowanych plików złączonych w jeden. 0.1pl2 nie potrafi tego; zatrzyma się już po dekompresji pierwszego pliku w strumieniu. bzip2recover w wersjach niższych od 1.0.2 używał 32-bitowych liczb do reprezentacji pozycji bitu w skompresowanym pliku, więc nie mógł przetwarzać skompresowanych plików dłuższych niż 512 megabajtów. Wersja 1.0.2 i wyższe używają 64-bitowych liczb na niektórych obsługujących je platformach (zgodne z GNU oraz Windows). Aby sprawdzić, czy bzip2recover został zbudowany z takim ograniczeniem, należy uruchomić go bez żadnych argumentów. Zawsze istnieje możliwość zbudowania własnej wersji nieposiadającej tego ograniczenia - należy w tym celu skompilować program ze zmienną MaybeUInt64 zdefiniowaną jako 64-bitowa liczba całkowita.

AUTOR
Julian Seward, jseward@acm.org. https://sourceware.org/bzip2/ Idee zawarte w bzip2 są zasługą (przynajmniej) następujących osób: Michael Burrows i David Wheeler (transformacja sortująca bloki), David Wheeler (znów, koder Huffmana), Peter Fenwick (struktura kodowania modelu w oryginalnym bzip2 i wiele udoskonaleń) oraz Alistair Moffar, Radford Neal i Ian Witten (arytmetyczny koder w oryginalnym bzip2). Jestem im bardzo wdzięczny za ich pomoc, wsparcie i porady. Na stronie podręcznika w dystrybucji źródłowej znajdują się odsyłacze do źródeł dokumentacji. Christian von Roques zachęcił mnie do wymyślenia szybszego algorytmu sortującego po to, by przyspieszyć kompresję. Bela Lubkin zachęciła mnie do polepszenia wyników kompresji w najgorszych przypadkach. Donna Robinson przekonwertowała dokumentację do formatu XML. Skrypty bz* są oparte o skrypty z GNU gzip. Wiele osób przysłało łatki, pomogło w różnych problemach, pożyczyło komputery, udzieliło porad i było ogólnie pomocnych.

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Maciej Wojciechowski <wojciech@staszic.waw.pl>, Michał Górny <zrchos+manpagespl@gmail.com> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.