Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.


-


Упаковщики и архиваторы: в чем отличие?

Такие программы, как pkzip/pkunzip и arj, совмещают две разных функции: архивирование, т.е. помещение содержимого нескольких файлов в один (с сохранением информации о каждом файле), и упаковку, т.е. сжатие файла.

В Unix эти функции по историческим причинам реализуются отдельными программами: для упаковки используются compress, gzip, bzip2, а для архивации -- tar.

Замечание
Программы-архиваторы разрабатывались в первую очередь для резервного копирования (обычно на ленту). Кроме tar есть еще программы cpio и dump/restore, но их мы рассматривать не будем.

Кроме того, в любом Unix есть программа ar, которая хоть и умеет делать архивы из произвольных файлов, в первую очередь предназначена для создания библиотек объектных файлов, и будет рассматриваться в разделе "Компиляция и сборка программ".

У каждого архиватора и упаковщика есть свое стандартное расширение для имени файла, в таблице приведены большинство из них.

Расширение Тип файла
.gz Файл, упакованный gzip
.Z Файл, упакованный compress
.z Файл, упакованный pack
.bz2 Файл, упакованный bzip2
.tar Архив tar
.tar.gz Архив tar, упакованный gzip
.tgz То же, что .tar.gz
.taz То же, что .tar.Z
.zip Упакованный архив zip/pkzip
.arj Упакованный архив arj
.a Библиотека ar

"Классический" упаковщик compress

compress упаковывает указанный ему файл и добавляет к имени расширение .Z.

Пример (файл-пример termcap взят из директории /etc):

bobby:~% ls -l
total 428
-rw-r--r--   1 ivanov   lab5       434898 Sep 10 12:21 termcap
bobby:~% compress termcap
bobby:~% ls -l
total 200
-rw-r--r--   1 ivanov   lab5       203137 Sep 10 12:21 termcap.Z
bobby:~% _

Для распаковки используется программа uncompress:

bobby:~% uncompress termcap.Z
bobby:~% ls -l
total 428
-rw-r--r--   1 ivanov   lab5       434898 Sep 10 12:21 termcap
bobby:~% _

Предупреждение
Если указать ключ "-r" и имя директории, то будут упакованы/распакованы все файлы в этой директории. Этот ключ не означает "упаковать всю директорию в один файл"!

Более новый упаковщик: gzip

Gzip был создан как более мощная замена для compress. Используется он точно так же:

bobby:~% ls -l
total 428
-rw-r--r--   1 ivanov   lab5       434898 Sep 10 12:21 termcap
bobby:~% gzip termcap
bobby:~% ls -l
total 143
-rw-r--r--   1 ivanov   lab5       144719 Sep 10 12:21 termcap.gz
bobby:~% _

Gzip позволяет достигать больших степеней сжатия, чем compress, и поэтому почти вытеснил его. Поскольку большее сжатие занимает больше времени, есть возможность указать gzip'у, как паковать -- быстрее (и слабее) или лучше (и медленнее). Для этого служат ключи от "-1" (самое быстрое сжатие) до "-9" (наибольшее сжатие).

bobby:~% ls -l
total 428
-rw-r--r--   1 ivanov   lab5       434898 Sep 10 12:21 termcap
bobby:~% gzip -9 termcap
bobby:~% ls -l
total 142
-rw-r--r--   1 ivanov   lab5       143832 Sep 10 12:21 termcap.gz
bobby:~% _

По умолчанию используется "-6".

Для распаковки применяется программа gunzip.

Gunzip умеет также распаковывать файлы .Z и .z.

Самый современный упаковщик: bzip2

Bzip2 был создан сравнительно недавно -- в 1996 году. Он использует при паковке алгоритм Burrows-Wheeler (вместо Lempel-Ziv, применяемого в compress/gzip/zip), что позволяет достигать еще больших степеней сжатия. Платой за это является несколько большее время упаковки.

Используемые bzip2 ключи почти идентичны gzip'овым. Но bzip2 по умолчанию использует наилучшее сжатие ("-9").

bobby:~% ls -l
total 428
-rw-r--r--   1 ivanov   lab5       434898 Sep 10 12:21 termcap
bobby:~% bzip2 termcap
bobby:~% ls -l
total 115
-rw-r--r--   1 ivanov   lab5       116736 Sep 10 12:21 termcap.bz2
bobby:~% _

Общие свойства compress, gzip и bzip2

  • Во-первых, при упаковке и распаковке эти программы "заменяют" исходный файл упакованным/распакованным следующим образом: они читают содержимое исходного файла и пишут результат в файл с таким же именем, но с добавлением/удалением расширения (.Z/.gz/.bz2), а затем удаляют исходный файл. Поэтому, если на диске недостаточно места для обоих файлов одновременно (или есть ограничения по дисковой квоте), то упаковка/распаковка может не удаться.

  • Во-вторых, при упаковке и распаковке все они стараются сохранить максимум информации о файле -- упакованному/распакованному файлу устанавливаются те же права доступа и время, что и исходному.

  • В-третьих, если не указывать имя файла, то упаковываться/распаковываться будет стандартный ввод, а результат отправляться на стандартный вывод. Это позволяет использовать упаковщики в конвейерах, к примеру, сразу ужимая результаты какой-либо вычислительной программы.

  • В-четвертых, если указать ключ "-c" ("cat"), то вместо замены исходного файла результат будет отправлен на стандартный вывод.

  • В-пятых, для каждого из форматов есть программа, позволяющая просмотреть содержимое файла, не распаковывая его на диске. Для .Z и .gz это zcat, zmore и zless, а для .bz2 -- bzcat и bzless.

    Кроме того, по файлам .Z и .gz можно вести поиск "a-la grep" -- для этого служит программа zgrep.

    Замечание
    Вообще-то zcat -- это синоним "gunzip -c", а zless и bzless -- очень простые скрипты. Поскольку zgrep также является скриптом, то несложно написать его аналог для bzip2.

Архиватор tar

Первоначально tar был разработан для резервного копирования на ленту, отсюда и его название -- Tape ARchiver. Но, поскольку возможность помещать большое количество файлов внутрь одного чрезвычайно удобно (к примеру, для хранения и передачи групп файлов, например, дистрибутивов), то он получил более широкое распространение.

Вообще-то в каждом Unix есть свой подвид tar, со слегка отличающимися опциями. Но основные опции (создать, развернуть, проверить архив) одинаковы во всех версиях. В Linux используется GNU-версия tar, которая доступна в большинстве других Unix (иногда под именем "gtar").

Если tar используется для работы с файлами-архивами (а не с лентой), то его вызов обычно выглядит так:

tar <буква-команды>f <имя-архива.tar> [файлы...]

В качестве команды обычно используется одна из следующих букв:

c
(Create) создать архив;
x
(eXtract) распаковать архив;
t
(Test) просмотреть содержимое архива.

Например, чтобы создать архив /tmp/someconfs.tar содержащий файлы /etc/fstab и /etc/passwd:

bobby:~% tar cf /tmp/someconfs.tar /etc/fstab /etc/passwd
tar: Removing leading `/' from absolute path names in the archive
bobby:~% _

Здесь сразу надо заметить две особенности:

  • Во-первых, у файлов, имена которых указаны в абсолютном виде, т.е. начинаются со "/", tar автоматически этот "/" обрезает, чтобы позже можно было распаковать архив в любое место (а не только обратно в /etc/).
  • Во-вторых, при нормальной работе tar ничего не печатает на экране (в отличие от pkzip и arj). Чтобы он показывал обрабатываемые файлы, надо указать ключ "v":

bobby:~% tar cvf /tmp/someconfs.tar /etc/fstab /etc/passwd
tar: Removing leading `/' from absolute path names in the archive
etc/fstab
etc/passwd
bobby:~% _

Если указать "vv", то кроме имен будут показываться те же атрибуты, что и при "ls -l".

Вообще у tar довольно нестандартный синтаксис команд: хотя все ключи и можно указывать обычным способом (т.е. через "-"), и даже длинные ключи (с "--"), но обычно первым параметром ему указывается сочетание из нескольких букв, первая из которых является командой, а остальные -- ключами. Так, "f" -- это тоже ключ, который говорит, что далее указано имя файла-архива (поэтому "f" надо указывать в конце списка).

Замечание
Хотя в большинстве систем tar прекрасно понимает именно такой синтаксис, в некоторых старых Unix'ах перед "сочетанием букв" обязательно надо указывать "-".

Для просмотра архива используется команда "t" (ключ "v" указывает, что надо выдавать более полную информацию):

bobby:~% tar tvf /tmp/someconfs.tar
-rw-r--r-- root/root       756 1998-12-21 16:40 etc/fstab
-rw-r--r-- root/root      1309 1999-02-22 10:35 etc/passwd
bobby:~% _

Для распаковки применяется команда "x":

bobby:~% mkdir /tmp/test
bobby:~% cd /tmp/test
bobby:/tmp/test% ls -l
total 0
bobby:/tmp/test% tar xf /tmp/someconfs.tar
bobby:/tmp/test% ls -l
total 1
drwxr-xr-x   2 ivanov   lab5         1024 Mar  4 16:03 etc/
bobby:/tmp/test% ls -l etc/
total 3
-rw-r--r--   1 ivanov   lab5          756 Dec 21 16:40 fstab
-rw-r--r--   1 ivanov   lab5         1309 Feb 22 10:35 passwd
bobby:/tmp/test% _

Tar разворачивает дерево-содержимое архива в текущей директории. Чтобы распаковать архив в другую директорию, надо или перейти в нее (командой cd) или указать ключ "-C" (распаковываем в директорию /tmp):

bobby:~% ls -l etc
/bin/ls: etc: No such file or directory
bobby:~% ls -l /tmp/etc
/bin/ls: /tmp/etc: No such file or directory
bobby:~% tar xf /tmp/someconfs.tar -C /tmp
bobby:~% ls -l /tmp/etc
total 3
-rw-r--r--   1 ivanov   lab5          756 Dec 21 16:40 fstab
-rw-r--r--   1 ivanov   lab5         1309 Feb 22 10:35 passwd
bobby:~% _

Замечание
Вообще-то назначение ключа "-C" более общее, и надо хорошо себе представлять, что он будет делать в каждом конкретном случае. Но при распаковке всего архива такое использование достигает цели.

Обычно .tar-файлы держат упакованными (чаще всего gzip'ом). Самое простое -- создать архив и затем упаковать его. Но можно указать в качестве имени архива "-" -- тогда результат будет отправлен на стандартный вывод, и затем передать его gzip'у, стандартный вывод которого перенаправить в файл:

bobby:~% tar cf - /etc/fstab /etc/passwd | gzip >someconfs.tgz
tar: Removing leading `/' from absolute path names in the archive
bobby:~% ls -l
total 1
-rw-r--r--   1 ivanov   lab5          990 Mar  4 16:28 someconfs.tgz
bobby:~% _

При использовании GNU tar (например, в Linux) есть еще более простой способ: можно указать ключ "z", который означает "пропустить файл через gzip":

bobby:~% tar czf someconfs.tgz /etc/fstab /etc/passwd
tar: Removing leading `/' from absolute path names in the archive
bobby:~% ls -l
total 1
-rw-r--r--   1 ivanov   lab5          990 Mar  4 16:31 someconfs.tgz
bobby:~% _

Этот же ключ можно указывать при распаковке и просмотре архива.

Предупреждение
Если сказать tar'у создать архив в той же директории, откуда берутся исходные файлы (к примеру, в текущей: "tar cf archive.tar ."), то сам .tar-файл тоже попадет в архив -- точнее, та его часть, что была создана на момент начала добавления его самого.

Дело в том, что tar (в отличие от Dos'овских pkzip и arj) не проверяет, что файл, который он собирается поместить в архив -- это сам архив. Поэтому лучше сами файлы-архивы создавать вне того дерева, из которого берутся файлы, или прямо указывать список всех файлов, которые надо положить в архив.

Совет
Man-страница по tar довольно запутанна, поэтому лучше воспользоваться info-документацией ("info tar"), которая содержит разделы специально для начинающих (включая tutorial'ы).

Совместимость с Dos: zip/unzip, unarj

zip/unzip


Для манипуляций с .zip файлами практически в любом Unix есть программы zip и unzip, совместимые с pkzip/pkunzip версии 2.04.

Поскольку ключи zip и unzip почти идентичны оным у pkzip/pkunzip, ма не будем здесь их подробно рассматривать. Получить краткую справку можно, запустив любую из этих программ без параметров.

unarj


Для распаковки .arj-файлов есть программа unarj, совместимая с версией 2.41. В отличие от "настоящего" arj, она не умеет создавать .arj-архивы, не оптимизирована по скорости и поддерживает лишь небольшое количество опций.

Поддерживаются самые часто используемые опции arj -- просмотр и распаковка, но при распаковке нет возможности указать, какие файлы надо извлекать -- можно распаковать только весь архив.

Краткую справку можно получить, набрав просто "unarj" без параметров:

bobby:~% unarj
UNARJ (Demo version) 2.41a Copyright (c) 1991-93 Robert K Jung

Usage:  UNARJ archive[.arj]    (list archive)
        UNARJ e archive        (extract archive)
        UNARJ l archive        (list archive)
        UNARJ t archive        (test archive)
        UNARJ x archive        (extract with pathnames)

This is an ARJ demonstration program and ** IS NOT OPTIMIZED ** for speed.
You may freely use, copy and distribute this program, provided that no fee
is charged for such use, copying or distribution, and it is distributed
ONLY in its original unmodified state.  UNARJ is provided as is without
warranty of any kind, express or implied, including but not limited to
the implied warranties of merchantability and fitness for a particular
purpose.  Refer to UNARJ.DOC for more warranty information.

ARJ Software                    Internet address :  [email protected]
Robert and Susan Jung           CompuServe userid:  72077,445
2606 Village Road West
Norwood, Massachusetts 02062
USA
bobby:~% _

Поскольку unarj -- просто демо, то к нему отсутствует man-страница. Единственная имеющаяся документация -- файл /usr/doc/unarj-2.41a/unarj.doc (это обычный текстовый файл).