Программы записи, считывания и сжатия данных в UNIX 

В отличие от архиваторов используемых в DOS, таких как PKZIP или ARJ, собирающих файлы в архивы и одновременно сжимающих их, в UNIX имеются отдельные программы позволяющие собрать файлы в архив и записать его на какое-нибудь устройство или файл и программы позволяющие сжимать отдельные файлы, причем в качестве сжимаемого файла может быть архив предварительно созданный архиватором. Далее будут рассмотрены такие программы и показаны примеры их практического использования.

Программы для объединения файлов в архивы 


Внимание! Программы описанные в этом разделе только собирают файлы в архив но не сжимают его!

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

tar 


Это наиболее распространенная программа для архивирования данных, она имеется на всех реализациях UNIX и даже есть версия для DOS - gnutar.

Формат использования:

tar <команда>[ключ] [параметры] имена_файлов
Команда
Описание
с
Создание архива 
x
Извлечение данных из архива 
t
Просмотр содержимого архива 
Дополнительно за командой можно указать разнообразные ключи при указании которых могут быть также указаны дополнительные параметры:
Ключ
Параметр Описание 
v
нет  Позволяет просматривать детальную информацию о записываемых или извлекаемых данных, с командой t выдает полную информацию о размере файла, времени создания и т.д. 
f
имя_устройства  В качестве имя_устройства может быть указано имя устройства для накопителя на магнитной ленте (/dev/rmt/0) , дискеты (/dev/diskette) или имени файла на диске, если указать - , то в качестве устройства будет использован стандартный ввод (для команды x или t) или стандартный вывод (команда с). Если ключ f не указан то имя устройства берется из переменной $TAPE, в которой обычно хранится имя устройства для накопителя на магнитной ленте. 
h
нет  Позволяет записывать ссылки на файлы или директории так как это были бы сами эти файлы, если этот ключ не указан то в архив будет записано только что это ссылка на файл, а не его содержимое. 
Примеры использования:

tar cv *

Эта команда запишет все файлы с поддиректориями на накопитель на магнитной ленте или на устройство указанное в переменной $TAPE.

tar cvf /dev/diskette parts *tap

Эта команда запишет директорию parts и все файлы с расширением tap на дискету. Внимание! При записи таким образом все данные на дискете пропадут, потому что tar записывает данные не заботясь о файловой системе находящейся на дискете. Для того что бы записать файлы на дискету сформатированную в DOS создайте архив на диске а затем скопируйте его на дискету.

tar xvf docs.tar

Эта команда извлечет все файлы из архива docs.tar

tar cf - * | (cd /other; tar xvf -)

Эта команда копирует все файлы с поддиректориями из текущей директории в директорию /other , это бывает удобно при копировании большого количества данных из одной файловой системы в другую или при копировании по сети. Работает наглядней и быстрее чем cp -r * /other

cpio 


Эта программа менее известна обычным пользователям, вероятно потому, что имеет не привычный синтаксис. cpio ожидает на стандартном вводе список файлов которые нужно записать и записывает их на стандартный вывод. Поведение программы можно изменить с помощью дополнительных ключей. Если в качестве архива задано имя устройства, например /dev/rdiskette то при его заполнении cpio запросит вставить новую дискету или ленту. Это бывает очень удобно когда нужно перенести с машины на машину не соединенных сетью небольшое количество данных около 5-10 Mb, когда не хочется связываться с накопителем на магнитной ленте.

Формат использования:

cpio -o [ключи] < имена_файлов >имя_архива

cpio -i [ключи] < имя_архива

Примеры:

ls *.tap | cpio -oB -H odc -O /dev/rdisktette

либо
 
 
 

ls *.tap >list

ls *.inf >>list

cpio -oB -H odc -O /dev/rdiskette <list

В первом случае команда запишет все файлы с расширением .tap на дискету, причем если одной дискеты будет недостаточно то можно будет вставить следующую. Во втором примере создается файл list, в котором указаны имена всех файлов с расширением .tap и .inf, который направляется в cpio для указания какие файлы нужно записывать. Обратите внимание на то, что для задания имен файлов используются команды перенаправления ввода и конвейер командного интерпретатора UNIX.

cpio -iduBI /dev/rdiskette

Эта команда считывает все данные записанные вышеуказанным способом с дискеты в текущую директорию.

Если в вышеуказанных примерах использовать /dev/rmt/0 вместо /dev/rdiskette то можно записывать данные на ленту.
 

Программы для сжатия данных 


Внимание! Программы описанные в этом разделе сжимают каждый файл в отдельности, либо стандартный ввод!

Указанные здесь программы работают так сказать в паре. Одна сжимает данные а другая распаковывает. Сжатые файлы получают дополнительное расширение, например файл some_big_file.tar после сжатия получает имя some_big_file.tar.Z. Если нужно распаковать файл то программе распаковщику можно задать имя которое было до сжатия, то есть без дополнительного расширения. Более подробную информацию о программах можно получить с помощью команды man, например man compress

compress / uncompress / zcat 


Это наиболее распространенные программы для сжатия данных, она имеется на всех реализациях UNIX. Compress сжимает файлы указанные в качестве параметров, сжатые файлы получают дополнительное расширение .Z, а старые файлы удаляются, если имена файлов не указаны то данные ожидаются со стандартного ввода и будут записаны на стандартный вывод. Uncompress соответственно распаковывает файлы сжатые ранее compress'oм. Обратите внимание на то, что после распаковки сжатый файл также удаляется. Если вам необходимо иметь сжатый и несжатый файл одновременно, то можно воспользоваться еще одной программой - zcat. Эта программа распаковывает файл указанный в качестве параметра и направляет данные на стандартный вывод.

Формат использования:

compress [имена_файлов]

uncompress [имена_файлов[.Z]]

zcat <имя_файла>

Примеры:

compress *

сжимает все файлы в текущей директории

uncompress *Z

восстанавливает все файлы с расширением Z. Внимание! Если вы измените расширение у сжатого файла то uncompress не сможет его распаковать, не известно чем это обосновано, но сжатый файл обязательно должен иметь соответствующее расширение.

zcat long_file.c.Z > long.file.c

создает восстанавливает все файлы с расширением Z. Внимание! Если вы измените расширение у сжатого файла то ни uncompress ни zcat не смогут его распаковать, не известно чем это обосновано, но сжатый файл обязательно должен иметь соответствующие расширение.

gzip / gunzip / gzcat 


Эти программы аналогичны описанным выше с той разницей, что они распространяются в рамках проекта GNU фонда свободного программного обеспечения (FSF). Эти программы были написаны, отлажены и перенесены на все имеющиеся версии UNIX и DOS/Windows. Исходные тексты можно найти в Internet'e. По сравнению с compress, gzip имеет больший набор дополнительных опций а также сжимает в полтора, два раза лучше. Принцип работы аналогичен uncompress, только сжатые файлы получают расширение .gz.

Формат использования:

gzip [ключи] [имена_файлов]

gunzip [имена_файлов[.gz]]

gzcat <имя_файла>
Ключ
Описание
-r
Работать с вложенными поддиректориями 
-v
Показывает имя файла и процент сжатия 
-#
Степень сжатия (от 1 до 9), т.е. -1 - быстрое, но мин. сжатие, -9 - макс. сжатие. 
-h
Краткая подсказка о ключах 
Примеры:

gzip -9rv *

сжимает все файлы в текущей директории и во всех вложенных директориях c максимальным сжатием и информацией о каждом сжатом файле

gunzip *gz

восстанавливает все файлы с расширением gz.
 
 
 
 
 
 

Реальные пример работы с вышеописанными программами 


Рассмотрим ситуацию когда вам нужно перенести детали DUCT размером в несколько мегабайт с одной станции на другую на дискетах.

cd /dcam

перейдем в каталог, в котором находится каталог parts содержащий детали. В большинстве случаев это /dcam. Если Вы не уверены в том где у Вас хранятся детали выполните следующие команды: cd `pathname 4`; cd ..

tar cvf - parts | gzip -9 >parts.tar.gz

записывает все файлы в директории parts в архив который по мере создания подается на стандартный вывод, где в свою очередь через конвейер получается gzip'oм и сжимается. Полученный результат записывается в файл parts.tar.gz

Если размер файла получился больше размера дискеты то вам необходимо выключить систему Volume management:

/etc/init.d/volmgt stop

записать наш файл на дискеты:

ls parts.tar.gz | cpio -oBH odc -O /dev/rdiskette

и включить Volume management обратно:

/etc/init.d/volmgt start

Иначе можно записать не выключая Volume management:

ls parts.tar.gz | cpio -oBH odc -O /vol/dev/aliases/floppy0
 

Следующие команды выполняются на станции на которую нужно записать детали.

cd

Перейдем в свой домашний каталог

cpio -iduBI /dev/rdiskette

Как было указано выше если данные были разбиты на несколько дискет необходимо выключить Volume management как указано выше, иначе используйте /vol/dev/aliases/floppy0 вместо /dev/rdiskette

gzcat parts.tar.gz | tar xvf -

Распакуем файл на стандартный вывод и извлечем файлы из tar архива. Обратите внимание на то что tar архив существует только в конвейере. В результате у Вас получится директория parts и останется файл parts.tar.gz который в дальнейшем можно удалить.

В принципе можно посоветовать хранить все данные которые должны всегда быть под в сжатом виде. Особенно это касается .pic, .tri, .tap, .inf и .cut файлов.