15 przykładów poleceń tar dla administratora i programistów

Format tar jest popularnym sposobem na archiwizację danych w systemach operacyjnych typu Unix i Linux.

Nazwa „tar” wywodzi się od „Tape ARchive”, ponieważ początkowo narzędzie to służyło do zapisywania danych w sposób sekwencyjny na taśmach magnetycznych. Niekiedy archiwum tar określa się również mianem „tarball”.

Standardowo, tar tworzy archiwum bez kompresji, jednak z wykorzystaniem pewnych segmentów. Istnieje możliwość użycia różnorodnych metod kompresji, aby uzyskać pliki wynikowe o mniejszej objętości. Program tar jest zwykle instalowany domyślnie w większości dystrybucji Linuksa. Format ten jest również obsługiwany przez inne systemy operacyjne, w tym Windows i macOS, przy użyciu odpowiednich narzędzi.

W tym tekście przeanalizujemy kilka typowych zastosowań i przykładów użycia polecenia tar, jak również omówimy dostępne dla niego opcje.

Zacznijmy więc…

Tworzenie archiwum tar

Aby utworzyć proste, nieskompresowane archiwum, należy użyć polecenia tar o następującej składni:

$ tar cvf <nazwa-pliku-tar> <pliki-do-archiwizacji>

W tym zapisie litera „c” oznacza tworzenie, „v” włącza tryb szczegółowy (wyświetla informacje o procesie), a „f” definiuje nazwę tworzonego archiwum tar. Zgodnie z przyjętą konwencją, nazwa pliku tar powinna kończyć się rozszerzeniem .tar. Pliki do zarchiwizowania można podać za pomocą symboli wieloznacznych, pojedynczo lub jako listę nazw plików bądź ścieżek.

Przykładowo, w moim katalogu znajdują się trzy pliki:

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

Jeśli chcemy utworzyć archiwum tar zawierające wszystkie te trzy pliki, wykonujemy to w następujący sposób:

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

Możemy także wskazać jedynie wybrane pliki do zarchiwizowania, na przykład:

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

Tworzenie skompresowanego archiwum (GZ)

Tar umożliwia nie tylko archiwizację, ale również kompresję plików, co pozwala na zaoszczędzenie miejsca na dysku. Popularnym formatem kompresji jest gunzip, zazwyczaj oznaczany rozszerzeniem .gz po .tar lub jako tgz. Aby określić, że pliki mają być skompresowane za pomocą gunzip, używamy opcji „z”. Poniżej znajduje się przykład:

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

Można zauważyć, że rozmiary obu archiwów znacząco się różnią, mimo że oba zawierają te same trzy pliki. Jest to wynik zastosowania kompresji za pomocą flagi „z”.

Tworzenie skompresowanego archiwum (BZ2)

Narzędzie tar obsługuje również inne formaty kompresji, w tym bz2 lub bzip2, oznaczane rozszerzeniem tar.bz2 lub czasami tbz2. Ten format może dać mniejszy rozmiar archiwum, ale w zamian za to wymaga więcej mocy obliczeniowej procesora, co oznacza, że proces kompresji i dekompresji może być wolniejszy w porównaniu do archiwum gz.

Przykład:

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

Rozpakowywanie wszystkich plików

Archiwa tar, zarówno skompresowane, jak i nieskompresowane, można rozpakować za pomocą opcji „x”. Poniższe przykłady wyjaśniają, jak to działa:

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

Podobnie działa to dla skompresowanego archiwum 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
$

Oraz dla archiwum skompresowanego za pomocą 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
$

Wyświetlanie zawartości archiwum tar

Aby wyświetlić listę plików znajdujących się w archiwum tar, należy użyć opcji „t”, jak w poniższym przykładzie:

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

Rozpakowywanie określonych plików

Można rozpakować tylko wybrane pliki z archiwum tar, tar.gz lub tar.bz2, podając ich nazwy w poleceniu:

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

Można też podać kilka nazw plików oddzielonych spacjami, aby wypakować je jednocześnie.

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

Rozpakowywanie z użyciem symboli wieloznacznych

Aby wyodrębnić jeden lub więcej plików przy pomocy symbolu wieloznacznego, użyj opcji –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
$

Dodawanie plików do archiwum

Nowe pliki mogą być dodawane do istniejącego nieskompresowanego archiwum za pomocą opcji „r” lub –append, podając nowe nazwy plików lub używając symboli wieloznacznych. Należy pamiętać, że działa to tylko w przypadku nieskompresowanych plików .tar, a nie ze skompresowanymi formatami tar.gz lub 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 widać, po ponownym wyświetleniu zawartości archive.tar, dwa nowo dodane pliki są uwzględnione.

Usuwanie plików z archiwum

Możliwe jest usunięcie określonych plików z archiwum tar, używając opcji –delete, jak pokazano poniżej. Porównaj listę plików w archiwum przed i po usunięciu plików:

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

Podobnie jak w przypadku dodawania, również usuwanie działa tylko z nieskompresowanymi archiwami i nie zadziała dla skompresowanych formatów archiwów.

Tworzenie z weryfikacją

Podczas tworzenia nieskompresowanych plików tar, zawartość archiwum można zweryfikować za pomocą opcji „W”:

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

Nie można użyć tej opcji w połączeniu z flagami kompresji, chociaż utworzony plik tar można później skompresować za pomocą gzip lub innych narzędzi.

Wypakowywanie archiwum tar do folderu

Jeżeli chcesz wyodrębnić zawartość archiwum tar do określonego folderu, a nie do bieżącego katalogu, użyj opcji „-C” wraz ze ścieżką do folderu:

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

Używanie opcji diff

Możesz użyć opcji –diff lub „d”, aby porównać pliki w archiwum tar z plikami w systemie plików i wykryć ewentualne zmiany. Poniżej przykład, w którym porównanie zostało wykonane, gdy plik wewnątrz archiwum i na zewnątrz był taki sam. Po aktualizacji pliku, porównanie zostało wykonane ponownie, aby pokazać różnicę w wynikach:

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

Wykluczanie plików

Podczas tworzenia archiwów tar może być konieczne wykluczenie pewnych plików. Można to zrobić za pomocą opcji –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 widać na powyższym przykładzie, opcję –exclude można podać wielokrotnie, aby określić wiele nazw plików lub wzorców w ramach warunku AND. Zauważ, że z sześciu plików w katalogu w powyższym przykładzie, tylko dwa pliki spełniły warunek, aby zostać dołączonymi do archive.at.gz.

Sprawdzanie rozmiaru zawartości archiwum tar

Możemy poznać rozmiar zawartości skompresowanego archiwum tar za pomocą następującego polecenia:

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

Analogicznie dla archiwum 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
$

Zachowywanie uprawnień

Standardowo, polecenie tar zachowuje uprawnienia do plików i folderów, które archiwizuje. Można jednak jawnie określić, aby je zachowało, używając opcji „-p” lub –preserve-permissions, jak w poniższym przykładzie:

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

Podsumowanie 👨‍💻

tar jest użytecznym narzędziem w systemach Unix/Linux, służącym głównie do archiwizacji danych i tworzenia kopii zapasowych. Wraz z upływem czasu narzędzie to zostało rozbudowane o wiele opcji. Może być używane do prostych i złożonych zadań, pod warunkiem znajomości jego możliwości. W tym artykule omówiliśmy podstawowe operacje, które można wykonywać za pomocą polecenia tar i pokazaliśmy, jak może ono wspomagać codzienne zadania administracyjne.

Więcej szczegółów można znaleźć na stronie manuala polecenia, wpisując „man tar” lub używając poleceń „tar –help” lub „tar –usage”.


newsblog.pl