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

tar je jedním z oblíbených formátů archivace souborů dostupných v systémech založených na Unixu a Linuxu.

Samotný název je odvozen od Tape ARchive, protože byl vyvinut pro zápis sekvenčních dat na pásková zařízení. Někdy se také nazývá tarball.

Ve výchozím nastavení tar archivuje pouze soubory bez komprese, ale s použitím některých částí. Pro získání komprimovaného výstupu můžeme použít různé kompresní techniky. Nástroj tar je obvykle standardně součástí většiny distribucí Linuxu a samotný formát je podporován v jiných operačních systémech, včetně Windows a macOS, prostřednictvím různých nástrojů a utilit.

V tomto článku probereme některé běžné příklady a použití příkazu tar a jeho podporovaných příznaků.

Pojďme tedy začít…

Vytvořit archiv tar

Chcete-li vytvořit jednoduchý nekomprimovaný archiv, syntaxe příkazu tar je:

$ tar cvf <tar-file-name> <files-to-archive>

Zde příznaky c znamenají vytvoření, v pro podrobný výstup a f pro specifikaci názvu souboru archivu tar. Podle konvence zadejte název souboru tar s příponou .tar. Soubory k archivaci lze zadat pomocí zástupných znaků nebo jako jeden nebo více názvů/cest k souborům.

Jako příklad mám ve svém adresáři tři 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 chci vytvořit archiv tar obsahující všechny tři soubory, lze to provést takto:

$ 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
$

Mohu také určit pouze konkrétní soubory k archivaci, například:

$ 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řit komprimovaný archiv (GZ)

tar umožňuje nejen archivaci souborů, ale také jejich komprimaci pro úsporu místa. Jedním z populárních kompresních formátů je gunzip, obvykle reprezentovaný příponou .gz za .tar nebo jako tgz. Můžeme použít příznak z k určení, že potřebujeme soubory komprimovat pomocí gunzip. Zde je příklad:

$ 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
$

Můžete pozorovat, že velikost obou archivních souborů je podstatně odlišná, i když oba obsahují stejné tři soubory. To je způsobeno použitím komprese pomocí příznaku z.

Vytvořit komprimovaný archiv (BZ2)

tar podporuje několik dalších kompresních formátů. Jedním z nich je bz2 nebo bzip2, který je reprezentován příponou tar.bz2 nebo někdy jako tbz2. Může vám to poskytnout menší velikost archivu, ale zase spotřebovává více CPU, takže proces komprese/dekomprese může být pomalejší než archiv gz.

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
$

Rozbalit všechny soubory

Archiv tar (ať už komprimovaný nebo nekomprimovaný) lze extrahovat jednoduše pomocí volby x. Níže uvedené příklady objasní 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
$

Toto funguje pro komprimovaný archiv gz jako:

$ 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
$

Nebo dokonce pro komprimovaný archiv bz2 jako:

$ 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
$

Seznam obsahu tar

Chcete-li zobrazit obsah archivu tar, můžete použít příznak t, jak je uvedeno níže:

$ 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
$

Untar Specific Files

Z archivu tar nebo tar.gz nebo tar.bz2 lze extrahovat pouze jeden soubor zadáním názvu souboru jako:

$ 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 zadat více názvů souborů oddělených mezerou a extrahovat je najednou.

$ 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
$

Untar pomocí zástupných znaků

Chcete-li extrahovat jeden nebo více souborů pomocí zástupného znaku PATTERN, použijte příznak –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řidat soubory do archivu

Nové soubory lze přidat/přidat k existujícím nekomprimovaným tarballům pomocí příznaku r nebo –append s novými názvy souborů nebo vzorem zástupných znaků (pamatujte, že to funguje pouze s nekomprimovanými soubory .tar a nikoli s komprimovanými formáty 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
$

Můžete pozorovat, že výpis obsahu archive.tar opět ukazuje dva nově přidané soubory.

Odstraňte soubory z archivu

Odebrání konkrétních souborů z archivu tar je možné pomocí příznaku –delete, jak je znázorněno níže (srovnejte výpis tar před a po odstraně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
$

Opět to funguje pouze pro nekomprimované tarbally a selže u komprimovaných archivních formátů.

Vytvořte pomocí Verify

Při vytváření nekomprimovaných souborů tar můžete ověřit obsah archivu pomocí W flag jako:

$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$

Toto nelze použít s příznaky komprese, i když můžete vytvořený soubor tar komprimovat později pomocí gzip nebo jiných nástrojů.

Extrahujte tar do složky

Pokud chcete extrahovat obsah tarballu do konkrétní složky místo aktuálního adresáře, použijte příznak -C s cestou k adresáři, jak je uvedeno níže:

$ 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žít příznak rozdílu

K nalezení jakýchkoli změn mezi soubory v archivu tar a soubory v souborovém systému můžete použít příznak –diff nebo d. Zde je příklad, který spustí rozdíl jednou, když byl soubor uvnitř taru a vnějšku stejný. Po aktualizaci souboru byl soubor spuštěn znovu, aby se ukázal rozdíl ve výstupu.

$ 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čit soubory

Při vytváření archivů tar může být požadavkem vyloučení konkrétních souborů. Toho lze dosáhnout pomocí příznaku –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 si můžete všimnout z výše uvedeného výstupu, můžeme zadat příznak –exclude vícekrát, abychom specifikovali více názvů souborů nebo vzorů v podmínce AND. Všimněte si, že ze šesti souborů v adresáři ve výše uvedeném příkladu pouze dva soubory splnily podmínku pro zahrnutí do archive.at.gz.

Zobrazit velikost obsahu tar

Velikost obsahu komprimovaného archivu tar můžeme získat pomocí následujícího příkazu:

$ 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
$

Zachovat oprávnění

Ve výchozím nastavení zachovává příkaz tar oprávnění souborů a adresářů, které archivuje, i když totéž můžete explicitně zadat pomocí parametru -p nebo –preserve-permissions, jak je uvedeno níže:

$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

Shrnutí 👨‍💻

tar je užitečný nástroj na systémech Unix/Linux po dlouhou dobu a byl primárně používán v úlohách archivace a zálohování. Nástroj se postupem času vyvíjel s mnoha možnostmi. Pokud znáte funkce, které nabízí, lze jej použít pro jednoduché až složité úkoly. Tento článek popisuje některé základní operace, které můžete provádět s příkazem tar, a ukazuje, jak vám může pomoci při každodenních úlohách správy systému.

Chcete-li získat další podrobnosti, podívejte se na jeho manuálovou stránku man tar nebo použijte příkaz tar –help nebo tar –usage.