Формат 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.