Obsługa archiwów plików

Michał ‘mina86’ Nazarewicz | 12 lutego 2008

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 LGLP)
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)