15 примера за команди tar за сисадмин и разработчици

tar е един от популярните формати за архивиране на файлове, налични в Unix и Linux базирани системи.

Самото име произлиза от Tape ARchive, тъй като е разработено за запис на последователни данни на лентови устройства. Понякога се нарича и tarball.

По подразбиране tar архивира само файловете без компресия, но използвайки някои части. Можем да използваме различни техники за компресиране, за да получим компресиран изход. Помощната програма tar обикновено е включена в повечето Linux дистрибуции по подразбиране, а самият формат се поддържа в други операционни системи, включително Windows и macOS, чрез различни инструменти и помощни програми.

В тази статия ще разгледаме някои от често срещаните примери и използване на командата tar и нейните поддържани флагове.

И така, нека да започнем…

Създайте tar архив

За да създадете прост некомпресиран архив, синтаксисът за командата tar е:

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

Тук флаговете c означават създаване, v за подробен изход и f за указване на името на архивния файл в tar. По конвенция, посочете името на файла tar с разширение .tar. Файловете за архивиране могат да бъдат посочени със заместващи символи или като единични или множество имена/пътища на файлове.

Като пример, имам три файла в моята директория:

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

И искам да създам tar архив, съдържащ и трите файла, може да се направи като:

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

Мога да посоча само конкретни файлове за архивиране, като:

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

Създаване на компресиран архив (GZ)

tar не само позволява архивиране на файлове, но също така ги компресира, за да спести място. Един от популярните формати за компресиране е gunzip, обикновено представен от разширение .gz след .tar или като tgz. Можем да използваме z флаг, за да посочим, че трябва файловете да бъдат компресирани с gunzip. Ето един пример:

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

Можете да забележите, че размерът на двата архивни файла е значително различен, въпреки че и двата съдържат едни и същи три файла. Това се дължи на използването на компресия чрез z флаг.

  Как да получите Google Обратно търсене на изображения на вашия iPhone във всяко приложение

Създаване на компресиран архив (BZ2)

tar поддържа няколко други формата за компресиране. Един от тях е bz2 или bzip2, който е представен от разширение tar.bz2 или понякога като tbz2. Може да ви даде по-малък размер на архива, но от своя страна консумира повече CPU, така че процесът на компресиране/декомпресиране може да бъде по-бавен от gz архива.

Пример:

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

Разархивирайте всички файлове

Архив tar (независимо дали е компресиран или некомпресиран) може да бъде извлечен просто с помощта на опцията x. Примерите по-долу ще изяснят употребата му:

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

Това работи за 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
$

Или дори за 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
$

Списък на съдържанието на tar

За да изброите съдържанието на tar архив, можете да използвате флага 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
$

Разархивирайте конкретни файлове

Само един файл може да бъде извлечен от архив tar или tar.gz или tar.bz2, като посочите име на файл като:

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

По същия начин можете да посочите няколко имена на файлове, разделени с интервал, за да ги извлечете заедно наведнъж.

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

Разархивирайте с помощта на заместващ знак

За да извлечете един или повече файлове с помощта на шаблон за заместване, използвайте флага за заместващи знаци:

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

Добави файлове в архива

Нови файлове могат да се добавят/добавят към съществуващи некомпресирани tarballs чрез използване на r или –append флаг с нови имена на файлове или шаблон за заместващи знаци (не забравяйте, че това работи само с некомпресирани .tar файлове, а не с компресирани формати tar.gz или 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
$

Можете да забележите, че изброяването на съдържанието на archive.tar отново показва двата новодобавени файла.

  Коригирайте видеообаждането на Microsoft Teams, което не работи

Изтриване на файлове от архива

Премахването на конкретни файлове от tar архив е възможно с помощта на флага –delete, както е показано по-долу (сравнете списъка на tar преди и след изтриване на файлове):

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

Отново това работи само за некомпресирани tarballs и няма да успее за компресирани архивни формати.

Създайте с Verify

Докато създавате некомпресирани tar файлове, можете да проверите съдържанието на архива с помощта на W флаг като:

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

Това не може да се използва с флагове за компресия, въпреки че можете да компресирате създадения tar файл по-късно с помощта на gzip или други инструменти.

Извличане на tar в папка

Ако искате да извлечете съдържанието на tarball в конкретна папка вместо в текущата директория, използвайте флага -C с пътя на директорията, както е показано по-долу:

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

Използвайте разл. флаг

Можете да използвате –diff или d флаг, за да намерите промени между файловете в tar архива и тези във файловата система. Ето един пример, който изпълнява разликата веднъж, когато файлът вътре и извън tar е един и същ. След актуализирането на файла той беше стартиран отново, за да покаже разликата в изхода.

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

Изключване на файлове

Изключването на определени файлове може да бъде изискване при създаване на tar архиви. Това може да се постигне с флаг за изключване.

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

Както можете да забележите от горния изход, можем да посочим флага –exclude няколко пъти, за да посочим множество имена на файлове или шаблони в условие И. Обърнете внимание, че от шестте файла в директорията в горния пример само два файла отговарят на условието да бъдат включени в archive.at.gz.

  8-те най-добри платформи за бизнес разузнаване (BI) и анализ през 2022 г

Преглед на размера на съдържанието на tar

Можем да получим размера на съдържанието на компресиран tar архив, като използваме командата по-долу:

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

По същия начин за 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
$

Запазване на разрешенията

По подразбиране командата tar запазва разрешенията за файловете и директориите, които архивира, въпреки че можете изрично да посочите същото, като използвате флага -p или –preserve-permissions, както е показано по-долу:

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

Резюме 👨‍💻

tar е полезна помощна програма за Unix/Linux системи от дълго време и се използва предимно при задачи за архивиране и архивиране. Помощната програма се разви с много опции с течение на времето. Може да се използва за прости до сложни задачи, ако знаете функциите, които предлага. Тази статия обхваща някои от основните операции, които можете да извършвате с командата tar, и показва как тя може да ви помогне в ежедневните ви задачи за системно администриране.

Обърнете се към страницата му man tar или използвайте командата tar –help или tar –usage, за да получите повече подробности.