Архивирование и упаковка данных

tar: Архиватор для накопителей на магнитной ленте (Tape ARchiver)

tar, как и find, - это одна из старейших утилит UNIX®, поэтому её синтаксис несколько специфичен. Вот он:

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

Вот список некоторых опций. Обратите внимание, что все они имеют эквивалентную длинную запись, но вам понадобится обратиться к странице руководства tar, т.к. здесь мы их перечислять не будем.

[Note]Note

теперь в 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, назвать его images.tar.bz2, упаковать bzip2'ом и поместить в свой домашний каталог. Для этого наберите следующее:

#
 # Примечание: вы должны находится в каталоге, файлы
 # которого вы хотите заархивировать!
 #
$ 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 в странице рукводства.

bzip2 и gzip: Программы упаковки данных

Вы видите, что мы уже упоминали эти две программы, когда рассматривали tar. В отличии от WinZip® для Windows® архивирование и упаковка выполняются при помощи двух разных утилит –– tar для архивации; и две программы для упаковки данных, с которыми мы сейчас ознакомимся: bzip2 и gzip. Вы также можете использовать и другие существующие утилиты упаковки для GNU/Linux, такие как zip, arj или rar (но используются они весьма редко).

Для начала следует отметить, что упаковщик bzip2 был написан для замены gzip. Его степень сжатия обычно гораздо выше, но с другой стороны для него требуется больше памяти при работе. Несмотря на это, gzip все еще используется для совместимости со старыми системами.

Обе команды имеют похожий синтаксис:

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

Если не указано имя файла, и gzip, и bzip2 будут ожидать данные со стандартного ввода и отправлять результат на стандартный вывод. Поэтому вы можете использовать обе программы в каналах. Они также имеют набор общих опций:

  • -1, ..., -9: установка степени сжатия. Чем больше число, тем выше степень сжатия и медленнее процесс упаковки.

  • -d: распаковка файл(ов). Это эквивалентно использованию утилит gunzip или bunzip2.

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

[Warning]Warning

По умолчанию и gzip, и bzip2 удаляют упакованные (или распакованные) файлы, если только вы не используете опцию -c. В bzip2 вы можете избежать этого, воспользовавшись опцией -k. В gzip эквивалентной опции нет.

А теперь несколько примеров. Допустим, что вам нужно упаковать при помощи bzip2 все файлы в текущем каталоге, заканчивающиеся на .txt. Для этого наберите:

$ bzip2 -9 *.txt

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

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

. Вместо bzip2 -dc вы могли ввести bzcat. Это аналог программы gzip, но она называется zcat, а не gzcat. У вас также есть bzless для файлов bzip2 и zless для gzip, если вы хотите просмотреть упакованные файлы сразу без предварительной их распаковки. В качестве упражнения попробуйте найти команды, которые вам понадобиться ввести для просмотра упакованных файлов без распаковки их посредством bzless или zless.