• mina86.com

  • Categories
  • Code
  • Contact
  • Obsługa archiwów plików

    Posted by Michał ‘mina86’ Nazarewicz on 12th of February 2008 | (cite)

    Prędzej czy później, korzystając z GNU/Linuksa przyjdzie konieczność zpakowania lub rozpakowania jakichś plików. Artykuł opisuje jak to zrobić z głównym naciskiem pracy w konsoli.

    Rozpakowywanie

    Jak to zwykle bywa, rodzaj archiwum rozpoznaje się po rozszerzeniu pliku, a zależnie od rodzaju pliku należy wykonać różne polecenia:

    gz
    gzip -d nazwa-pliku.roz(1)
    gzip -cd <nazwa-pliku.roz >nazwa-pliku
    bz2, xz lub lzma
    bzip2/xz/lzma -d nazwa-pliku.roz(1)
    bzip2/xz/lzma -cd <nazwa-pliku.roz >nazwa-pliku
    bzip2/xz/lzma -kd nazwa-pliku.roz
    tar
    tar xvf nazwa-pliku.tar(2)
    tar.Z
    tar Zxvf nazwa-pliku.tar.Z(2, 4)
    uncompress -c <nazwa-pliku.tar.Z | tar vx(2)
    tar.gz lub tgz(3)
    tar zxvf nazwa-pliku.roz(2, 4)
    gzip -d <nazwa-pliku.roz | tar vx(2)
    tar.bz2 lub tbz(3)
    tar jxvf nazwa-pliku.roz(2, 4)
    bzip2 -d <nazwa-pliku.roz | tar vx(2)
    tar.xz lub txz(3)
    tar Jxvf nazwa-pliku.roz(2, 4)
    xz -d <nazwa-pliku.roz | tar vx(2)
    tar.lzma
    xz -d <nazwa-pliku.tar.lzma | tar vx(2)
    Z
    uncompress nazwa-pliku.Z(1)
    uncompress -c <nazwa-pliku.Z >nazwa-pliku
    arj
    unarj nazwa-pliku
    zip
    unarj/unzip nazwa-pliku
    rar
    unrar nazwa-pliku.rar
    ace
    unace x nazwa-pliku.ace
    7z
    7zr x nazwa-pliku.7z

    Notki:

    1. Po rozpakowaniu plik źródłowy zostanie skasowany. Aby temu zapobiec należy skorzystać z jednej z alternatyw.
    2. Wytłumaczenie znaczenia literek w pierwszym parametrze:
      • x (od eXtract) — rozpakuj plik,
      • v (od Verbose) — zapisz do stderr (najprawdopodobniej na konsole) nazwy aktualnie przetwarzanych plików,
      • f (od File) — odczytaj (w przypadku tworzenia archiwum TAR zapisz) dane z (do) pliku podanego jako kolejny argument,
      • Z, z, j, J — „filtruj” dane przez odpowiednio uncompress, gzip -d, bzip2 -d lub xz -d, dzięki czemu zostaje on najpierw dekompresowany (w przypadku tworzenia skomrpesowanego archiwum TAR parametr powoduje kompresje pliku).
    3. tgz to skrót od tar.gz, tbz od tar.bz2 (rzadko spotykane), a txz od tar.xz.
    4. Na niektórych systemach opcje Z, z, j lub J programu tar mogą nie działać. Wówczas należy użyć alternatywnej wersji z potokiem.

    Pakowanie

    W przypadku pakowania plików opiszę jedynie archiwa tar, gdyż (o ile mi wiadomo) inne popularne archiwa wymagają korzystania z programów nie będących wolnym oprogramowaniem. Aby spakować kilka plików lub katalog do archiwum należy użyć polecenia:

    tar vcf nazwa-pliku.tar katalog/lista-plików

    i po sprawie, przy czym pliki są jedynie spakowane, a nie skompresowane. Jak je skompresować opiszę niżej.

    Jako ciekawostkę można powiedzieć, że archiwum tar zostało pierwotnie zaprojektowane jako system plików do zapisu danych na kasetach magnetofonowych, z których najłatwiej było odczytywać bloki po 512 bajtów przez co wewnętrzna struktura pliku tar charakteryzuje się użyciem takich właśnie bloków. Każdy plik ma nagłówek zajmujący 512 bajtów i jest przechowywany w blokach po 512 bajtów każdy. Jeżeli ostatniego bloku nie zapełnia do końca to jest on wypełniany zerami.

    Należy również zauważyć, że program tar używa filozofii blokowej także w stosunku do samego pliku archiwum. Przejawia się to parametrem -N, dzięki któremu można określić wielkość takiego bloku. Domyślnie jest to 20*512 czyli 10KiB. Warto mieć to na uwadze, żeby później się nie zdziwić, że dwa czy trzy pliki, które sumarycznie mają rozmiar 1KiB w rezultacie są pakowane do archiwum o wielkości 10KiB.

    Kompresja

    By skompresować jakiś plik (np. wcześniej utworzone archiwum tar) należy użyć jednej z komend:

    Z
    compress nazwa-pliku
    compress <nazwa-pliku >nazwa-pliku.Z
    gz
    gzip -9 nazwa-pliku
    gzip -9 <nazwa-pliku >nazwa-pliku.gz
    bz2, xz lub lzma
    bzip2/xz/lzma -9 nazwa-pliku
    bzip2/xz/lzma -9 <nazwa-pliku >nazwa-pliku.roz
    bzip2/xz/lzma -9k nazwa-pliku

    Pierwsze polecenie z serii powoduje, że nieskompresowany plik zostaje skasowany.

    Format Z jest już starym, zapomnianym formatem i w zasadzie jedyne jego wykorzystanie to trzymanie źródeł Linuksa 0.01 coby były w takiej formie w jakiej były udostępnione przez Linusa Torvaldsa. Zdecydowanie nie zaleca się używania tegoż formatu.

    Format bz2 daje zazwyczaj lepszą kompresję niż gz (choć nie musi to być prawdą dla małych plików) przy czym działa wolniej, co jest w szczególnie odczuwalne w przypadku dużych plików. Idąc dalej, xz kompresują zazwyczaj jeszcze lepiej.

    Pakowanie i kompresja razem

    Pakowanie i kompresje można wykonać w jednym kroku. Oto jak tego dokonać:

    tar.Z
    tar Zcf nazwa-pliku.tar.Z lista-plików
    tar Zc lista-plików >nazwa-pliku.tar.Z
    tar c lista-plików | compress >nazwa-pliku.tar.Z
    tar.gz
    tar zcf nazwa-pliku.tar.gz lista-plików
    tar zc lista-plików >nazwa-pliku.tar.gz
    tar c lista-plików | gzip -9 >nazwa-pliku.tar.gz
    tar.bz2
    tar jcf nazwa-pliku.tar.bz2 lista-plików
    tar jc lista-plików >nazwa-pliku.tar.bz2
    tar c lista-plików | bzip2 -9 >nazwa-pliku.tar.bz
    tar.xz
    tar Jcf nazwa-pliku.tar.xz lista-plików
    tar Jc lista-plików >nazwa-pliku.tar.xz
    tar c lista-plików | xz -9 >nazwa-pliku.tar.xz
    tar.lzma
    tar c lista-plików | lzma -9 >nazwa-pliku.tar.lzma

    Osobiście preferuję ostatnią metodę, gdyż daje ona największą kontrolę nad poleceniem kompresji. Dodatkowo, opcje Z, z, j lub J mogą nie działać na danym systemie, a wersja z potokami działa zawsze.

    Midnight Commander

    Jeżeli ktoś nie lubi bawić się czystą linią komend to może też skorzystać z Midnight Commandera (mc). Obsługuje on część z wymienionych formatów. W przypadku rozpakowywania wystarczy do archiwum „wejść” tak jak do zwykłego katalogu i można z niego przegrywać pliki gdzie tylko się chce. W przypadku pakowania i kompresji należy zaznaczyć pliki, które chce się spakować i wcisnąć F2. Powinno pojawić się okienko, w którym należy podać tym archiwum oraz jego nazwę.

    Potrzebne programy

    Większość z tych programów jest dostępna w najpopularniejszych dystrybucjach Linuksa.

    tar
    www.gnu.org/software/tar/ (licencja: GNU GPL)
    gzip
    www.gzip.org (licencja: GNU GPL)
    bzip2
    sources.redhat.com/bzip2/ (licencja: BSD-style)
    xz
    tukaani.org/xz/ (licencja: public domain, GNU GPL, GNU LGPL)
    lzma
    tukaani.org/lzma/ (licencja: public domain, GNU GPL, GNU LGPL)
    7zip
    www.7-zip.org (licencja: GNU LGPL)
    unzip
    www.info-zip.org/pub/infozip/UnZip.html (licencja: bazuje na BSD)
    unrar
    www.rarlabs.com (licencja: Closed Source, ale darmowa)
    unace
    www.winace.com (licencja: Closed Source, ale darmowa)