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.