15 прикладів команд tar для системних адміністраторів і розробників

Формат tar є одним із затребуваних методів створення архівів у системах, що базуються на Unix і Linux.

Назва “tar” походить від “Tape ARchive”, оскільки спочатку його розробляли для запису даних на магнітні стрічки. Іноді його ще називають “tarball”.

Зазвичай, tar лише створює архів з файлів, не стискаючи їх. Однак, використовуючи додаткові опції, можна застосовувати різні способи стиснення для зменшення розміру архіву. Утиліта tar зазвичай присутня в більшості дистрибутивів Linux за замовчуванням, а сам формат підтримується і в інших операційних системах, таких як Windows та macOS, через різноманітні інструменти та програми.

У цій статті ми розглянемо деякі типові приклади застосування команди tar та її параметрів.

Отже, почнімо…

Створення tar-архіву

Синтаксис команди tar для створення простого нестисненого архіву має такий вигляд:

$ tar cvf <назва_tar_файлу> <файли_для_архівування>

Тут ключ “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”.

Створення стисненого архіву (BZ2)

tar підтримує кілька інших форматів стиснення. Один із них – bz2 або bzip2, що позначається розширенням tar.bz2 або іноді tbz2. Це дозволяє отримати менший розмір архіву, проте, потребує більших обчислювальних ресурсів, тому процеси стиснення/розпакування можуть відбуватись повільніше, ніж для 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
$

Розпакування за допомогою масок

Для видобування одного або кількох файлів за допомогою маски PATTERN, використовуйте опцію “–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
$

Додавання файлів до архіву

Нові файли можна додавати до існуючих нестиснених архівів, використовуючи опцію “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 з’явилися щойно додані файли.

Видалення файлів з архіву

Видалити певні файли з 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
$

Знову ж таки, це працює лише для нестиснених архівів і не застосовується до стиснених форматів.

Створення з перевіркою

Під час створення нестиснених 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 у папку

Якщо треба видобути вміст архіву в окрему папку, а не в поточний каталог, то використовуйте опцію “-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

Можна застосовувати опцію “–diff” або “d” для виявлення змін між файлами в tar-архіві та файлами у файловій системі. Ось приклад, де diff виконується один раз, коли файли всередині та поза 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-архівів. Цього можна досягти, використовуючи опцію “–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
$

Як бачите з наведених результатів, можна вказати опцію “–exclude” декілька разів, щоб задати декілька імен файлів або масок, які будуть виключатись. Зауважте, що із шести файлів у каталозі, тільки два файли відповідали умові включення до archive.at.gz.

Перегляд розміру вмісту 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.