Formát tar představuje oblíbenou metodu pro archivaci souborů, která je hojně využívána v operačních systémech typu Unix a Linux.
Jeho název vychází z počátečního určení „Tape ARchive“, kdy sloužil k ukládání dat sekvenčně na pásková média. Často se také setkáte s označením „tarball“.
Standardně tar pouze seskupuje soubory bez jejich komprimace, ale nabízí možnosti integrace s různými kompresními algoritmy. Tento nástroj je obvykle součástí standardní výbavy většiny linuxových distribucí. Formát tar je rovněž podporován v jiných operačních systémech, jako jsou Windows a macOS, prostřednictvím specializovaných aplikací a utilit.
V tomto článku si projdeme několik typických situací a ukážeme si, jak příkaz tar používat spolu s jeho klíčovými parametry.
Začněme tedy…
Vytvoření archivu tar
Pro vytvoření základního nekomprimovaného archivu se používá následující syntaxe příkazu tar:
$ tar cvf <nazev-tar-souboru> <soubory-k-archivaci>
Zde parametr `c` značí vytvoření nového archivu, `v` aktivuje podrobný výpis a `f` specifikuje název výsledného tar souboru. Běžně se tar soubory označují příponou `.tar`. Soubory, které mají být archivovány, můžete specifikovat pomocí zástupných znaků nebo explicitním uvedením názvů a cest k souborům.
Například v mém adresáři se nacházejí tři textové soubory:
$ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
A nyní si vytvoříme archiv obsahující všechny tři z nich:
$ tar cvf archive.tar * file1.txt file2.txt file3.txt $ ls -l archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar $
Je také možné vybrat pouze některé konkrétní soubory pro archivaci:
$ tar cvf archive1.tar file1.txt file2.txt file1.txt file2.txt $ ls -l archive1.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar $
Vytvoření komprimovaného archivu (GZ)
Kromě archivace samotné tar umožňuje i komprimaci souborů, což šetří diskový prostor. Jedním z často využívaných kompresních algoritmů je gunzip, který se typicky označuje příponou `.gz` připojenou k `.tar`, tedy `.tar.gz` nebo zkráceně `.tgz`. Pro aktivaci komprese pomocí gunzip se používá parametr `z`. Ukázka použití:
$ tar cvzf archive.tar.gz file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $
Je patrný rozdíl ve velikosti obou archivů, přestože obsahují stejné soubory. To je důsledkem použití komprese prostřednictvím parametru `z`.
Vytvoření komprimovaného archivu (BZ2)
Tar podporuje i další kompresní formáty, například bz2 nebo bzip2, které se označují příponou `.tar.bz2` nebo `.tbz2`. Tento formát může dosáhnout ještě menší velikosti archivu, nicméně jeho komprese a dekomprese bývá pomalejší než u formátu gz, jelikož vyžaduje více procesorového času.
Příklad:
$ tar cvjf archive.tar.bz2 file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 12 20:25 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $ file archive.tar* archive.tar: POSIX tar archive (GNU) archive.tar.bz2: bzip2 compressed data, block size = 900k archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10240 $
Rozbalení všech souborů
Pro rozbalení obsahu archivu tar (ať už komprimovaného nebo ne) slouží parametr `x`. Následující příklady ukazují jeho použití:
$ tar xvf archive.tar file1.txt file2.txt file3.txt $ ls -l total 24 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Stejným způsobem funguje i rozbalení komprimovaného archivu gz:
$ tar xvf archive.tar.gz file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
A také pro komprimovaný archiv bz2:
$ tar xvf archive.tar.bz2 file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Zobrazení obsahu tar
Chcete-li si prohlédnout seznam souborů obsažených v archivu tar, použijte parametr `t`:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $
Rozbalení specifických souborů
Z archivu tar, tar.gz nebo tar.bz2 lze extrahovat pouze vybrané soubory, pokud zadáte jejich názvy:
$ tar xvf archive.tar.bz2 file1.txt file1.txt $ ls -l total 8 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt $
Podobně můžete rozbalit více souborů najednou, stačí je vyjmenovat oddělené mezerou:
$ tar xvf archive.tar.bz2 file1.txt file3.txt file1.txt file3.txt $ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Rozbalení pomocí zástupných znaků
Pro extrakci jednoho nebo více souborů s využitím zástupných znaků použijte parametr `–wildcards`:
$ tar xvf archive.tar.bz2 --wildcards "file*" file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Přidání souborů do archivu
Nové soubory lze přidat do existujícího nekomprimovaného archivu tar pomocí parametru `r` nebo `–append` spolu s novými názvy souborů nebo zástupnými znaky. Důležité je, že tato funkce funguje pouze pro nekomprimované soubory `.tar`, nikoliv pro komprimované archivy typu `.tar.gz` nebo `.tar.bz2`:
$ tar rvf archive.tar file-new* file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $
Jak vidíme, výpis obsahu archivu `archive.tar` nyní zahrnuje dva nově přidané soubory.
Odebrání souborů z archivu
Odebrání specifických souborů z archivu tar je možné pomocí parametru `–delete`, jak ukazuje následující příklad (porovnejte výpis archivu před a po smazání souborů):
$ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $ tar --delete -f archive.tar file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt $
Tato funkce také funguje pouze s nekomprimovanými archivy tar a selže u komprimovaných formátů.
Vytvoření s ověřením
Během vytváření nekomprimovaného archivu tar můžete ověřit jeho obsah pomocí parametru `W`:
$ tar cvfW archive.tar file*.txt file1.txt file2.txt file3.txt Verify file1.txt Verify file2.txt Verify file3.txt $
Tento parametr nelze použít s kompresními parametry, avšak výsledný tar soubor můžete následně komprimovat pomocí gzip nebo jiných nástrojů.
Rozbalení do specifické složky
Chcete-li rozbalit obsah tar archivu do určité složky namísto aktuálního adresáře, použijte parametr `-C` spolu s cestou k cílové složce:
$ tar xvf archive.tar -C new-directory/ file1.txt file2.txt file3.txt file2.txt file4.txt $ ls -l new-directory/ total 16 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt -rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt $
Použití parametru rozdílu
Pro detekci rozdílů mezi soubory uvnitř archivu tar a soubory v souborovém systému můžete využít parametr `–diff` nebo `d`. Následující příklad ukazuje, jak detekce proběhne, pokud je soubor v archivu a v systému stejný. Po aktualizaci souboru je pak detekován rozdíl:
$ tar dvf archive.tar file4.txt file4.txt $ $ echo newline > file4.txt $ $ tar dvf archive.tar file4.txt file4.txt file4.txt: Mod time differs file4.txt: Size differs $
Vyloučení souborů
Při vytváření archivu tar může být potřeba vyloučit některé soubory. To lze provést pomocí parametru `–exclude`.
$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/ dir/ dir/file1.txt dir/file3.txt $ ls -l dir total 24 -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt $ tar tvf archive.tar.gz drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/ -rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt -rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt $
Jak vidíme, parametr `–exclude` můžeme použít i vícekrát, a tím specifikovat více názvů souborů nebo vzorů pro vyloučení. Z šesti souborů v adresáři tak byly do archivu `archive.tar.gz` zařazeny pouze dva.
Zobrazení velikosti obsahu tar
Pro zjištění velikosti obsahu komprimovaného archivu tar můžeme použít následující příkaz:
$ tar tvf archive.tar.gz -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xzf archive.tar.gz --to-stdout|wc -c 56 $
Podobně pro archiv bz2:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xjf archive.tar.bz2 --to-stdout|wc -c 56 $
Zachování oprávnění
Standardně příkaz tar uchovává oprávnění souborů a složek, které archivuje. Tuto funkci lze explicitně specifikovat pomocí parametru `-p` nebo `–preserve-permissions`:
$ tar cvpzf archive.tar.gz *.txt file1.txt file2.txt file3.txt $
Shrnutí 👨💻
Tar je užitečný nástroj, který se v Unixových a Linuxových systémech hojně využívá již velmi dlouho, především pro archivaci a zálohování dat. S postupem času se vyvíjel a nabízí dnes mnoho možností. Pokud si osvojíte jeho funkce, můžete jej využít pro jednoduché i komplexní úlohy. Tento článek popisuje některé základní operace, které lze s příkazem tar provádět, a ukazuje, jak může být užitečný při každodenní správě systému.
Pro další podrobnosti se můžete podívat na manuálovou stránku příkazu `man tar` nebo použít `tar –help` případně `tar –usage`.