4. Архівування і упаковка даних

4.1. tar: Архіватор для нагромаджувачів на магнітній стрічці (Tape ARchiver)

tar, як і find, - це одна з найстаріших утиліт UNIX®, тому її синтаксис кілька специфічний. Ось він:

tar [опції] [файли...]

Ось список деяких з опцій. Зверніть увагу, що всі вони мають еквівалентний довгий запис, але вам знадобиться звернутися до сторінці керівництва tar(1), бо тут ми їх перераховувати не будемо.

[Примітка]Примітка

Тепер в tar не використовується початкове тире (-) перед короткими опціями, за винятком використання після довгої опції.

  • c: використовується для створення нових архівів.

  • x: використовується для отримання файлів з існуючого архіву.

  • t: виводить список файлів з існуючого архіву.

  • v: докладний режим. Выводить список файлів, доданих чи витягнутих з архіву. У поєднанні з опцією t (див. вище) виводить список файлів в довгому форматі замість короткого.

  • f <ім'я_файлу>: створює архів з ім'ям ім'я_файлу, витягує з архіву з ім'ям ім'я_файлу чи виводить список файлів архіву ім'я_файлу. Якщо цей параметр відсутній, файлом за умовчанням буде /dev/rmt0, який зазвичай є спеціальним файлом, що пов'язаний зі стримером. Якщо ім'ям файла є - (тире), введення чи введення даних (залежно від того, створюється архів чи виконується добування з нього) буде асоційовано зі стандартним входом чи виходом.

  • z: повідомляє tar'у, що створюваний архів має бути стиснутий за допомогою gzip, або, що архів, з якого виконується добування, упакований gzip'ом.

  • j: еквівалент z, але для стискання використовується програма bzip2.

  • p: при вилученні файлів з архіву зберігає всі файлові атрибути, включаючи власника, час останнього доступу і так далі. Дуже корисна для дампів файлової системи.

  • r: додає в існуючий архів файли, список яких вказаний у командному рядку. Зверніть увагу, що архів, в який ви хочете додати файли, має бути не стиснутим!

  • A: додає архіви, вказані в командному рядку, до архіву, вказаному опцією f. За аналогією з опцією r, щоб це спрацювало, архіви мають бути не стиснутими.

Існує ще безліч інших опцій, тому для одержання повного списку ви можете звернутися до сторінці керівництва tar(1). Погляньте, наприклад, на опцію d.

Давайте розглянемо приклад. Припустимо, потрібно створити архів з усіма зображеннями каталогу /shared/images, стиснути його bzip2'ом, назвати images.tar.bz2 і помістити свій домашній каталог /home. Для цього наберіть наступне:

 #
 # Примітка: ви повинні бути в каталозі, файли 
 #   якого ви хочете додати до архіву!
 #
$ cd /shared
$ tar cjf ~/images.tar.bz2 images/

Як бачите, тут ми використовували три опції: c повідомила tar'у, що нам потрібно створити архів, j упакувала його за допомогою bzip2, а f ~/images.tar.bz2 створила в нашому домашньому каталозі архів з ім'ям images.tar.bz2. Тепер у нас може виникнути бажання перевірити цілісність архіву. Для цього ми можемо вивести список його файлів:

 #
 # Повертаємося назад у домашній каталог
 #
$ cd
$ tar tjvf images.tar.bz2

Тут ми повідомили tar'у вивести список (t) файлів архіву images.tar.bz2 (f images.tar.bz2), і попередили його про те, що цей архів був стиснутий за допомогою bzip2 (j), а також про те, що нам потрібно отримати список у довгому форматі (v). Тепер, припустимо, що ви видалили каталог з зображеннями. На щастя у вас залишився недоторканний архів, і тепер ви хочете розпакувати його в оригінальне місце розташування у /shared. Але, якщо ви не хочете порушити роботу команди find при пошуку нових зображень, потрібно зберегти всі атрибути файлів:

 #
 # перехід до каталогу, в який ви хочете виконати вилучення
 #
$ cd /shared
$ tar jxpf ~/images.tar.bz2

Ось і все!

Тепер давайте припустимо, що нам потрібно отримати з архіву лише каталог images/cars. Тоді ви можете набрати наступне:

$ tar jxf ~/images.tar.bz2 images/cars

Якщо ви спробуєте зробити резервну копію спеціальних файлів, програма tar помістить їх у архів “як є”, не виконуючи дампу їх вмісту. Тому ви можете спокійно помістити в архів файл /dev/mem. Також tar коректно працює з посиланнями, тож не хвилюйтеся щодо цього. З приводу символічних посилань погляньте на опцію h на сторінці керівництва.

4.2. bzip2 і gzip: Програми стискання даних

Ми вже говорили про ці дві програми, коли розглядали tar. На відміну від WinZip® для Windows®, архівування і стиснення здійснюється двома різними утилітами: tar для архівації і дві програми для стиснення bzip2 і gzip, розглядом яких ми зараз і займемося. Ви також можете скористатися іншими утилітами стиснення даних, такими як zip, arj чи rar, які також існують для GNU/Linux (але дуже рідко використовуються).

Для початку слід зазначити, що bzip2 був написаний для заміни gzip. Його коефіцієнт стиснення зазвичай набагато вище, але з іншої сторони для його роботи потрібно більше ресурсів. Попри це, gzip все ще використовується для сумісності зі старими системами.

Обидві команди мають схожий синтаксис:

gzip [опції] [файл(и)]

Якщо ім'я файла не зазначено, і gzip, і bzip2 чекатимуть на дані зі стандартного входу і відправляти результат на стандартний вихід. Тому ви можете використовувати обидві програми в каналах. Вони також мають набір загальних опцій:

  • -1, ..., -9: встановлення коефіцієнту стиснення. Чим більше кількість, тим краще стиснення, але й повільнішій сам процес.

  • -d: розпакування файлів. Це еквівалентно використанню утиліт gunzip чи bunzip2.

  • -c: скидання на стандартний вихід результатів стиснення/розпакування файлів, вказаних у вигляді параметрів.

[Застереження]Застереження

За умовчанням і gzip, і bzip2 видаляють упаковані (чи розпаковані) файли, якщо тільки ви не використовуєте опцію -c. У bzip2 ви можете уникнути цього, скориставшись опцією -k. У gzip еквівалентній опції немає.

Тепер наведемо кілька прикладів. Припустимо, ви хочете упакувати всі файли у поточному каталозі, назви яких закінчуються на .txt, використовуючи програму bzip2 з максимальним коефіцієнтом стиснення. Ви можете зробити це так:

$ bzip2 - 9 *.txt

Тепер ви хочете поділитися своїми зображеннями с кимось, але у нього не має bzip2, а є лише gzip. Вам немає потреби розпаковувати архів, а потім знову упаковувати його. Ви можете просто розпакувати його на стандартний вихід, а потім, скориставшись каналом, упакувати стандартний вихід і перенаправити результат в новий архів: Приміром, так:

bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz

Ви могли викликати bzcat замість bzip2 -dc. Це аналог програми gzip, але називається вона zcat, а не gzcat. Також у вашому розпорядженні є bzless для bzip2-файлів і zless для gzip, якщо ви хочете переглядати упаковані файли безпосередньо, без попереднього розпакування. Як вправи знайдіть і спробуйте команди, необхідні для перегляду стиснутих файлів без їх розпакування і без використання утиліт bzless чи zless.