15 příkladů příkazů tar pro správce systému a vývojáře

Photo of author

By etechblogcz

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`.