Такие программы, как 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 (это обычный текстовый файл).