Kompresja i archiwizacja

Narzędzia do kompresji i archiwizacji działają według typowej w uniksie zasady: wykonuj dobrze jedno zadanie. W tym przypadku oznacza to, istnienie oddzielnych narzędzi do tworzenia archiwum plików – pliku, który zawiera w sobie wiele plików, ale nie jest skompresowany oraz narzędzi do kompresji, które potrafią skompresować pojedynczy plik.

Uzyskanie skompresowanego archiwum wymaga współpracy dwóch narzędzi.

tar

tar (Tape ARchiver) początkowo narzędzie służące do utworzenia kopii zapasowych plików na taśmie magnetycznej. (Kasety były i są nośnikiem używanym do tworzenia kopii zapasowych w systemach, które generują duże objętości danych). W chwili obecnej raczej stosowany z plikiem wyjściowym do tworzenia/rozpakowania archiwum.

Podstawowe wywołanie:

$ tar -cf archiwum.tar plik1 plik2 ... plikn

tworzy archiwum o nazwie archiwum.tar zawierające podane pliki (lub katalogi). Potocznie jest używana nazwa tarball, która oznacza skompresowane lub nie archiwum tar.

$ tar -xf archiwum.tar

Rozpakowuje pliki z archiwum.tar do bieżącego katalogu. Można też włączyć tryb verbose (gadatliwy) aby przy wypakowaniu zobaczyć listę plików:

$ tar -xfv archiwum.tar

Uwaga: ze względów historycznych tar akceptuje również tzw. opcje w stylu BSD – bez poprzedzania ich znakiem -

tar xfv archiwum.tar # przykład opcji w stylu BSD

Uwaga: przy tworzeniu archiwum ważna jest kolejność argumentów. Nazwa archiwum POPRZEDZA pliki do spakowania. W przypadku błędnego wywołania:

$ tar -cf plik1 plik2 ... plikn archiwum.tar # NIE!

tar utworzy archiwum o nazwie plik1. Spowoduje to UTRACENIE starej zawartości plik1.

Uwaga: rozpakowywanie archiwum zastępuje, bez pytania, istniejące pliki o takich samych nazwach!!

Kompresja

Istnieje wiele algorytmów kompresji, a co za tym idzie wiele programów do kompresji.

Standard POSIX definiuje program compress, który używa algorytmów opatentowanych w roku 1984. Większe możliwości współczesnych komputerów i postęp w dziedzinie algorytmów kompresji pozwolił na uzyskanie znacznie skuteczniejszych metod, co spowodowało, że program compress jest rzadko używany w praktyce. Pliki skompresowane tym programem można jeszcze czasem spotkać, ich rozszerzenie to .Z (wielkość liter ma znaczenie).

Współcześnie popularne są następujące programy (nie są częścią POSIX, ale występują w prawie każdym systemie UNIX i podobnym:

kompresja dekompresja rozszerzenie
gzip gunzip .gz
bzip2 bunzip2 .bz2
xz unxz .xz

Podstawowy sposób wywołania każdego z nich jest taki sam:

$ gzip plik.txt # tworzy skompresowaną wersję plik.txt.gz
$ gunzip plik.txt.gz # dekompresuje plik

Uwaga. Dekompresja domyślnie powoduje pozostawienie tylko rozpakowanego pliku, a usunięcie wersji skompresowanej. Kompresja podobnie. To zachowanie można zmodyfikować. Proszę sprawdzić opcję -k w manualu.

Każdy z programów ma opcje specyficzne dla danego algorytmu kompresji, można je znaleźć w manualu.

Skompresowany tar

Abu utworzyć skompresowane archiwum należy zastosować najpierw program tar, aby utworzyć archiwum, a następnie je skompresować:

$ tar -cf archiwum.tar plik1 plik2
$ bzip2 archiwum.tar

W celu wypakowania:

$ bunzip2 archiwum.tar.bz2  
$ tar -xvf archiwum.tar 

Typowym procesem jest właśnie tworzenie archiwów skompresowanych, w związku z tym tar posiada opcje pozwalające na automatyczne wywołanie programu do kompresji/dekompresji:

opcja tar program
-Z compress (jedyny obecny w POSIX)
-z gzip
-j bzip2
-J xz
$ tar -cjf archiwum.tar.bz2 plik1 plik2 # użycie bz2

Daje taki sam efekt końcowy, jak w poprzednim przypadku wywołania najpierw tar, potem bzip2.

Proszę zwrócić uwagę, że tym razem rozszerzenie nazwy pliku archiwum powinno zawierać rozszerzenie programu kompresującego.

Wypakowanie:

$ tar -xjfv archiwum.tar.bz2

Wariant z wywołaniem samego tar jest oczywiście znacznie wygodniejszy, zalecane jest użycie właśnie tego wariantu.

Ćwiczenia

Program du pozwala sprawdzić rozmiary plików podanych jako argumenty, opcja -h powoduje drukowanie wyniku w jednostkach zrozumiałych dla człowieka.

$ du -h plik1 plik2

Program wget pozwala na ściąganie plików z użyciem protokołu HTTP. Używanie wget nie jest umiejętnością wymaganą na teście zaliczeniowym. Wywołania wget w tym ćwiczeniu służą po prostu pobraniu plików, które należy skompresować. Równie dobrze można użyć przeglądarki internetowej.

Program diff zostanie szczegółowo omówiony na dalszych zajęciach. Program ten porównuje pliki ze sobą i wypisuje informację o liniach, które się różnią. Gdy pliki są identyczne, wyjście diff jest puste, a kod wyjścia 0 (sukces).

  1. Utworzyć katalog tar_cwiczenia, wejść do niego i wszystkie pliki z zadań tworzyć w tym katalogu Każde z ćwiczeń zakłada rozpoczęcie działań w tym katalogu.

  2. Kompresja jest procesem odwracalnym:

    Pobrać dowolny plik z ćwiczeniami z podstaw uniksa, zrobić jego kopię. Plik skompresować każdym z programów gzip, bzip2, xz, rozpakować i sprawdzić czy rozpakowany plik i kopia się różnią.

    $ wget 'http://mini.pw.edu.pl/~karwowskij/psu/lab5_tar.html' # pobranie
    $ cp lab5_tar.html lab5_kopia.html # utworzenie kopii do porównań.
    $ # <TU należy skompresować lab5_tar.html i zdekompresować go>
    $ diff lab5_tar.html lab5_kopia.html
    $ # Jeśli nie ma różnic, wyjście diff będzie puste
  3. Różne algorytmy kompresji mają różną skuteczność.

    Pobrać do testów plik tekstowy o większym rozmiarze.

    $ wget 'http://archive.ics.uci.edu/ml/machine-learning-databases/bag-of-words/vocab.nytimes.txt'

    Ściągnięty plik skompresować każdym z algorytmów. Na koniec porównać rozmiary skompresowanych plików i oryginału:

    $ du -h vocab.nytimes.txt{,.gz,.bz2,.xz} # można użyć shell pattern ,zamiast podawać wszystkie nazwy plików osobno
    $ du -h vocab.nytimes.txt* # albo tak

    Przekierować wyjście du do pliku statystyki.txt, aby skorzystać tych informacji później.

  4. Skuteczność zależy od struktury plików, które są kompresowane: Pobrać plik w formacie, który posiada wewnętrzną kompresję, na przykład obraz png lub jpeg.

    $ wget 'https://upload.wikimedia.org/wikipedia/commons/d/d7/Squirrel_Eating_a_peanut.jpg'

    Wykonać operacje jak w poprzednim ćwiczeniu. Porównać skuteczność kompresji (stosunek rozmiaru pliku skompresowanego do oryginalnego) w przypadku z ćw. 2 (plik tekstowy) i ćw 3 ( obrazek jpg). (jpg jest formatem pliku, który wewnętrznie jest już skompresowany).

  5. Używanie tar

    • Utworzyć katalog moje_dane.
    • Utworzyć archiwum dane.tar.bz2 zawierające katalog moje_dane (tar wywołać w katalogu zawierającym katalog moje_dane)
    • Skopiować do moje_dane przykładowe pliki i spróbować ponownie
    • Utworzyć drugie archiwum. Tym razem wejść do katalogu moje_dane i utworzyć archiwum pod ścieżką ../dane2.tar.bz2 zawierające wszystkie pliki z katalogu.
    • Utworzyć katalogi test1 i test2
    • Wejść do test1 i rozpakować dane.tar.bz2
    • Wejść do test2 i rozpakować dane2.tar.bz2
    • Oba archiwa zawierały te same pliki. Jaka jest różnica w zawartości test1 i test2?
  6. Nietypowe ścieżki i tar
    • Utworzyć archiwum zawierające pliki podane z użyciem ścieżki względnej, bezwzględnej, względnej zawierającej .., na przykład:

      • /etc/passwd
      • test1/lab3s.txt
      • ../../../..//home2/samba/karwowskij/dane.txt
    • Utworzyć testowy katalog do rozpakowania – test_cw5
    • Wejść do katalogu
    • Rozpakować archiwum z opcją -v
    • Obejrzeć listę nazw plików podaną przy wypakowaniu i powstałą strukturę katalogów.

Uwaga! Podczas normalnego użytkowania tar należy używać tylko ścieżek względnych, niezawierających ..