bzip2, bunzip2 - a block-sorting file compressor, v1.0.8
bzcat - dekompresuje pliki na standardowe wyjście
bzip2recover - odzyskuje dane z uszkodzonych plików bzip2
bzip2 [
-cdfkqstvzVL123456789] [
nazwy_plików...]
bzip2 [
-h|--help ]
bunzip2 [
-fkvsVL ] [
nazwy_plików...]
bunzip2 [
-h|--help ]
bzcat [
-s ] [
nazwy_plików...]
bzcat [
-h|--help ]
bzip2recover nazwa_pliku
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.
- -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 2300 k pamięci, jednak przy
szybkości o około połowę mniejszej niż
normalnie.
Podczas kompresji -s wybiera bloki wielkości 200 k,
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.
- -h --help
- Wyświetla komunikat pomocy i wychodzi.
- -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.
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: 400 k + (8 * rozmiar bloku)
Dekompresja: 100 k + (4 * rozmiar bloku) lub
100 k + (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
900 k
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 7600 k pamięci, ale zajęcie tylko
400 k + 20000 * 8 = 560 kilobajtów z tego. Podobnie, dekompresor
odnajdzie 3700 k, ale zajmie tylko 100 k + 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
bzip2 kompresuje pliki w blokach, zazwyczaj 900-kilbajtowych.
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.
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.
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.
This manual page pertains to version 1.0.8 of
bzip2. Compressed data
created by this version is entirely forwards and backwards compatible with the
previous public releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2
and above, but with the following exception: 0.9.0 and above can correctly
decompress multiple concatenated compressed files. 0.1pl2 cannot do this; it
will stop after decompressing just the first file in the stream.
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.
Julian Seward,
[email protected].
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.
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Maciej Wojciechowski <
[email protected]> i
Michał Górny <
[email protected]>
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 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]