Archiwizacja i pakowanie

To jest coś, co się na pewno przyda wszystkim. Zrobię tu nieduży przegląd pakerów i archiwizatorów.

Archiwa ZIP (*.zip)
To jest jeden z najpopularniejszych formatów kompresji. W jednym archiwum może się zmieścić wiele plików i katalogów. Stopień kompresji jest nienajgorszy, waha się w okolicach utraty 50% oryginalnego rozmiaru (rzecz jasna innych archiwów oraz plików *.mp3 nie daje się skompresować, więc tu stopień kompresji wynosi poniżej 10%). Programy obsługujące ten format, o ile to nie kombajny wieloformatowe, są przeważnie podzielone na kompresor i dekompresor, jak na przykład słynny pkzip/pkunzip. Nie inaczej jest w przypadku narzędzia dostępnego w linuksie: zip służy do pakowania, unzip zaś do rozpakowywania. Do komendy zip możesz dodać następujące przełączniki:

Przy czym składnia polecenia jest taka: zip przełączniki nazwa-archiwum pliki na ktorych bedziemy operowac [inne-przełączniki inne-pliki]. Przykład? Zaklęcie zip -r obrazki . -x pliki_tymczasowe/\* -i \*.jp\*g \*.gif \*.png doda z aktualnego katalogu i podkatalogów wszystkie pliki JPEG, GIF i PNG oprócz tych, które znajdują się w katalogu pliki_tymczasowe. Zuważ, że utworzone zostanie archiwum obrazki.zip. zip sam doda w miarę potrzeby rozszerzenie .zip. Najprostsze wywołanie to zip -r archiwum /katalog/do/spakowania oraz zip sciezka/do/archiwum nazwa_pliku_do_dodania

Archiwa TAR (*.tar)
Kiedyś popularne były napędy taśmowe (dziś to się nazywa streamer i jest dość rzadkie). Na takim napędzie zmieści się bardzo dużo (obecnie tak ze trzy-cztery duże dyski twarde i więcej, w zależności od rozmiaru kasety). Niestety, toto ma strasznie długi czas dostępu, bo taśma musi się przewinąć w odpowiednie miejsce. Dlatego taki sposób przechowywania danych nadaje się jedynie do kopii bezpieczeństwa. W takim razie nie da się na taśmie utworzyć normalnego systemu plików. Do tego stworzono tape archiver-a, w skrócie tara. Program ten scala wiele plików i katalogów w jeden plik, w którym zachowane są również informacje o atrybutach poszczególnych plików (nazwa pliku, prawa, czasy modyfikacji i dostępu i inne). Archiwum takie jednak nie jest skompresowane, można w dość prosty sposób wydostać stamtąd dane nie mając tara. Składnia programu jest niewyszukana: tar polecenie opcje pliki .... Jeśli masz archiwum *.tar i chcesz je rozpakować do aktualnego katalogu, to polecenie tar -x -f archiwum.tar, gdzie opcja -x odpowiada za rozpakowanie, zaś opcja -f mówi, żeby tar wykonał operację na pliku archiwum.tar. Jeśli podajesz opcję -f, to po niej musi nastąpić nazwa archiwum. Jak chcesz utworzyć nowe archiwum, wydaj komendę tar -c -f nowe.archiwum.tar pliki-do-spakowania ... - pliki zostaną spakowane z całą ścieżką podaną przez ciebie, na przykład tar -c -f arc.tar ../katalog spowoduje, że pliki zostaną spakowane z przedrostkiem ../katalog (odwołanie do katalogu nadrzędnego może powodować problemy przy rozpakowywaniu), tar -c -f arc.tar katalog spakuje pliki z katalogu katalog, a przy rozpakowaniu katalog zostanie utworzony. Z kolei cd katalog ; tar -c -f ../arc.tar . da takie archiwum, że pliki przy rozpakowywaniu nie będą w katalogu, tylko w katalogu bieżącym. Zostało jeszcze wylistowanie zawartości archiwum: tar -t -f nazwa-archiwum.tar.
Słowo wyjaśnienia odnośnie nazywania archiwów: nie musisz dodawać końcówki .tar do nazwy archiwum, ale jeśli ją pominiesz, nie zostanie dodana. tar leje na to, jemu do szczęścia nie potrzeba rozszerzenia .tar. Chociaż wskazane jest dla ciebie, żebyś dodał rozszerzenie. Drugie słowo: nazwa archiwum może być pojedynczym minusem. Wtedy archiwum zostanie utworzone na standardowym wyjściu lub odczytane ze standardowego wejścia. To może być niekiedy użyteczne (o czym przekonasz się dalej). GNU tar domyślnie archiwizuje dane na standardowe wyjście, a odczytuje archiwum ze standardowego wejścia, a tar dostarczany z Solarisem próbuje pracować na archiwum na domyślnym urządzeniu taśmowym.
Jeszcze dwa słowa o opcjach. Zauważyłeś, że tar pracuje po cichu. Jak chcesz, żeby wypisywał nazwy przetwarzanych plików, to dodaj opcję -v (ang. verbose, tryb gadatliwy). W przypadku listowania plików (-t) dostaniesz więcej informacji o plikach z archiwum. Nawiasem mówiąc to bardzo popularna opcja, powinna działać w podobny sposób w większości programów z serii GNU (linuksowych).
Opcje w programach GNU można łączyć: tar -c -v -f ../test.tar . pakujące aktualny katalog można zapisać w krótszej formie tar -cvf ../test.tar . Jedno zasługuje tu na szczególną uwagę: literka f musi wystąpić ostatnia w sekwencji opcji, ponieważ zaraz za nią tar oczekuje nazwy pliku (tarowi to akurat wisi, ale praktycznie każdy inny program tego wymaga). Możesz też ją oddzielić: tar -cv -f ../test.tar .
Pod Solarisem tar nie pochodzi z serii GNU. Tam nie są akceptowane opcje -c, -x i -t. Zamiast nich używa się c, x oraz t (znaczy to samo, ino bez minusów). Przykładowe polecenie: tar cf test.tar * Taka składnia bezminusowa działa również w GNU tarze.

Pliki skompresowane GZIP (*.gz)
Tak, to nie archiwa! Archiwum to plik mogący zawierać wiele innych plików. Archiwum może być formatu RAR, ZIP, ARJ, ACE, LHA/LZH czy TAR, ale GZIP to plik skompresowany. GZIP nie potrafi pomieścić więcej niż jeden plik naraz, co jest spowodowane ogólną koncepcją unixa: lepiej robić jedną rzecz naraz, ale porządnie, niż kilka rzeczy słabo. Kompresja GZIP jest takiej samej jakości, co ZIP (linuksowa komenda zip dawała pliki tych samych rozmiarów). Zresztą, jeśli chcesz umieścić kilka plików w jednym archiwum, umieść je najpierw w archiwum tar, które potem zgzipujesz. Składnia samego polecenia gzip jest banalna: gzip plik-do-skompresowania ... (trzy kropki oznaczają, że możesz kompresować kilka plików jedną komendą). Tylko tutaj czai się mała "pułapka": gzip usuwa plik nieskompresowany po spakowaniu. Dostajesz plik o nazwie plik-do-skompresowania.gz. Większość programów pod linuksa rozpoznaje pliki *.gz i w locie je dekompresuje, dlatego gzip usuwa pliki po spakowaniu. Jeśli nie chcesz usuwać pakowanego pliku, powinieneś wydać polecenie gzip -c plik > plik.gz Opcja -c powoduje, że gzip zapisuje skompresowany plik na standardowe wyjście (które najczęściej trzeba przekierować do pliku) i nie usuwa oryginalnego pliku. Rozpakowanie jest równie banalne: gunzip nazwa_pliku.gz (lub równoważnie gzip -d nazwa_pliku.gz). I tutaj kryje się ta sama "pułapka", co przy kompresji, a jej obejście jest identyczne.
Jeśli nie podasz gzipowi czy gunzipowi nazwy pliku do (de)kompresji, to program będzie czekał na standardowe wejście, a przetworzone dane zapisze na standardowe wyjście. W ten sposób można za jednym zamachem tworzyć i rozpakowywać archiwa *.tar.gz (w skrócie DOSowym zwane *.tgz): tworzenie archiwum tar -c * | gzip > archiwum.tar.gz [tar cf - * | gzip > archiwum.tar.gz dla Solarisa], rozpakowanie archiwum gunzip -c archiwum.tar.gz | tar -x [gunzip -c archiwum.tar.gz | tar xf -], wylistowanie archiwum gunzip -c | tar -t [gunzip -c archiwum.tar.gz | tar tf -].
Uwaga odnośnie GNU tara: program ten posiada wbudowaną opcję uruchamiania gzipa: tar -czf archiwum.tar.gz * (opcja -z)

Pliki skompresowane BZIP2 (*.bz2)
Pliki BZIP2 są dość mocno mniejsze od GZIP, ale za stopień kompresji trzeba zapłacić czasem kompresji. Kompresja wygląda praktycznie identycznie jak gzip: bzip2 nazwa-pliku, i tak samo tu jest "pułapka" kasowania pliku wejściowego, jak również sposób jej obejścia. Ale jest jeszcze jeden dodatkowy sposób, niedostępny w gzipie: opcja -k powoduje zachowanie oryginalnego pliku. Dekompresja wygląda takoż: bunzip2 nazwa-pliku.bz2 lub bzip2 -d nazwa-pliku.bz2. Komentarze identyczne.
Uwaga odnośnie GNU tara: podobnie, jak w przypadku gzip, bzip2 posiada swoją opcję w GNU tarrze -j: tar -cjf archiwum.tar.bz2 * (krótkie rozszerzenia tar.bz2 to tbz i tbz2). Chyba nie jest dziwne, że opcje -z i -j wzajemnie się wykluczają?


Dalsza część kursu
Poprzednia część kursu
Jadłospis