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

tar to jeden z popularnych formatów archiwizacji plików dostępnych w systemach opartych na systemach Unix i Linux.

Sama nazwa pochodzi od Tape ARchive, ponieważ została opracowana do zapisywania danych sekwencyjnych na urządzeniach taśmowych. Czasami jest również określany jako tarball.

Domyślnie tar archiwizuje tylko pliki bez kompresji, ale z wykorzystaniem niektórych części. Możemy użyć różnych technik kompresji, aby uzyskać skompresowane dane wyjściowe. Narzędzie tar jest zwykle domyślnie dołączane do większości dystrybucji Linuksa, a sam format jest obsługiwany w innych systemach operacyjnych, w tym Windows i macOS, za pośrednictwem różnych narzędzi i narzędzi.

W tym artykule omówimy niektóre typowe przykłady i użycie polecenia tar oraz obsługiwane przez nie flagi.

Więc zacznijmy…

Utwórz archiwum tar

Aby utworzyć proste nieskompresowane archiwum, składnia polecenia tar jest następująca:

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

Tutaj flagi c oznaczają tworzenie, v oznaczają szczegółowe dane wyjściowe, a f określają nazwę pliku archiwum tar. Zgodnie z konwencją podaj nazwę pliku tar z rozszerzeniem .tar. Pliki do zarchiwizowania można określić za pomocą symboli wieloznacznych lub jako jedną lub wiele nazw plików/ścieżek.

Na przykład mam trzy pliki w moim katalogu:

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

I chcę utworzyć archiwum tar zawierające wszystkie trzy pliki, można to zrobić jako:

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

Mogę również określić tylko określone pliki do zarchiwizowania, takie jak:

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

Utwórz skompresowane archiwum (GZ)

tar umożliwia nie tylko archiwizację plików, ale także ich kompresję w celu zaoszczędzenia miejsca. Jednym z popularnych formatów kompresji jest gunzip, zwykle reprezentowany przez rozszerzenie .gz po .tar lub jako tgz. Możemy użyć flagi z, aby określić, że potrzebujemy plików do skompresowania przy użyciu gunzip. Oto 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żesz zauważyć, że rozmiar obu plików archiwum jest zasadniczo różny, mimo że oba zawierają te same trzy pliki. Wynika to z zastosowania kompresji przy użyciu flagi Z.

Utwórz skompresowane archiwum (BZ2)

tar obsługuje kilka innych formatów kompresji. Jednym z nich jest bz2 lub bzip2, który jest reprezentowany przez rozszerzenie tar.bz2 lub czasami jako tbz2. Może to dać mniejszy rozmiar archiwum, ale z kolei zużywa więcej procesora, więc proces kompresji/dekompresji może być wolniejszy niż 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
$

Rozpakuj wszystkie pliki

Archiwum tar (zarówno skompresowane, jak i nieskompresowane) można rozpakować po prostu za pomocą opcji x. Poniższe przykłady wyjaśnią jego użycie:

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

Działa to w przypadku skompresowanego archiwum 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
$

Lub nawet dla skompresowanego archiwum 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
$

Wyświetl zawartość tar

Aby wyświetlić zawartość archiwum tar, możesz użyć flagi t, jak pokazano poniżej:

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

Rozpakuj określone pliki

Z archiwum tar, tar.gz lub tar.bz2 można wyodrębnić tylko jeden plik, podając nazwę pliku 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
$

Podobnie możesz określić wiele nazw plików oddzielonych spacją, aby wyodrębnić je razem za jednym razem.

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

Rozpakuj za pomocą Wildcard

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

Dodaj pliki do archiwum

Nowe pliki mogą być dodawane/dołączane do istniejących nieskompresowanych archiwów za pomocą flagi r lub –append z nowymi nazwami plików lub wzorcem wieloznacznym (pamiętaj, że działa to tylko z nieskompresowanymi plikami .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
$

Możesz zauważyć, że wyświetlenie zawartości pliku archive.tar ponownie pokazuje dwa nowo dodane pliki.

Usuń pliki z archiwum

Usunięcie określonych plików z archiwum tar jest możliwe za pomocą flagi –delete, jak pokazano poniżej (porównaj listę plików tar 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
$

Ponownie działa to tylko w przypadku nieskompresowanych archiwów i nie powiedzie się w przypadku skompresowanych formatów archiwów.

Twórz z Verify

Podczas tworzenia nieskompresowanych plików tar możesz zweryfikować zawartość archiwum za pomocą flagi W jako:

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

Nie można tego użyć z flagami kompresji, chociaż możesz później skompresować utworzony plik tar za pomocą gzip lub innych narzędzi.

Wypakuj tar do folderu

Jeśli chcesz wyodrębnić zawartość tarballa do określonego folderu zamiast do bieżącego katalogu, użyj flagi -C ze ścieżką do katalogu, jak pokazano poniżej:

$ 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żyj flagi diff

Możesz użyć flagi –diff lub d, aby znaleźć wszelkie zmiany między plikami w archiwum tar a plikami w systemie plików. Oto przykład, który uruchamia różnicę raz, gdy plik wewnątrz tar i na zewnątrz był taki sam. Po zaktualizowaniu pliku uruchomiono go ponownie, aby pokazać różnicę w danych wyjściowych.

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

Wyklucz pliki

Wykluczenie określonych plików może być wymagane podczas tworzenia archiwów tar. Można to osiągnąć za pomocą flagi –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 możesz zauważyć z powyższego wyniku, możemy podać flagę –exclude wiele razy, aby określić wiele nazw plików lub wzorców w warunku AND. Zauważ, że z sześciu plików w katalogu w powyższym przykładzie tylko dwa pliki spełniały warunek dołączenia do archive.at.gz.

Zobacz rozmiar zawartości tar

Możemy uzyskać rozmiar zawartości skompresowanego archiwum tar za pomocą poniższego 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
$

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

Zachowaj uprawnienia

Domyślnie polecenie tar zachowuje uprawnienia do plików i katalogów, które archiwizuje, chociaż można je jawnie określić, używając flagi -p lub –preserve-permissions, jak pokazano poniżej:

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

Podsumowanie 👨‍💻

tar jest użytecznym narzędziem w systemach Unix/Linux przez długi czas i był używany głównie do zadań archiwizacji i tworzenia kopii zapasowych. Narzędzie ewoluowało z wieloma opcjami w czasie. Może być używany do prostych i złożonych zadań, pod warunkiem, że znasz oferowane przez niego funkcje. W tym artykule omówiono niektóre podstawowe operacje, które można wykonać za pomocą polecenia tar, i pokazano, w jaki sposób może ono pomóc w codziennych zadaniach administracyjnych systemu.

Zapoznaj się z jego stroną podręcznika man tar lub użyj polecenia tar –help lub tar –usage, aby uzyskać dalsze szczegóły.