Утилита cpio

Команда cpio — наверное, древнейшее средство архивирования в UNIX, существующее с незапамятных времён. Архивные файлы в создаваемой ей формате понимаются в любых Unix-системах. И хотя она сама как архиватор пользовательских данных практически вышла из употребления, именно ею до недавнего времени собирались воедино компоненты пакетов в формате rpm. По этой причине (и ещё нескольким) о cpio необходимо сказать несколько слов.

Как можно понять из названия, утилита cpio (Copy Input/Outup) занимается копированием входящих файлов в выходящий архив и наоборот, развёртыванием входящего архива в выходящие файлы. Существует три режима её работы.

Первый режим, copy-out, задаваемый опцией -o (или --create), предусматривает считывание списка файлов (name list) со стандартного ввода и объединяет их в архив, который может быть направлен в архивный файл или непосредственно на устройство для записи резервных копий. Список файлов для архивирования может представлять собой вывод какой-либо иной команды. Так, в примере

$ find ./* | cpio -o > arch.cpio

файлы текущего каталога, найденные командой find (о ней будет отдельный, и очень большой, рассказ), при посредстве команды cpio будут направлены в архивный файл arch.cpio.

Второй режим, copy-in, вызываемый  опцией -i, или --extract) осуществляет обратную процедуру: развертывание ранее созданного архива в текущем каталоге:

$ cpio -i < arch.cpio

Здесь нужно заметить, что если разворачиваемый архив включает подкаталоги, автоматически они созданы не будут, и последует сообщение об ошибке. Для создания промежуточных каталогов команда cpio должна использоваться с опцией -d (--make-directories).

В третьем режиме (copy-pass, опция -p, или --pass-through) команда cpio выполняет копирование файлов из одного дерева каталогов в другой, комбинируя режимы copy-out и copy-in, но без образования промежуточного архива. Список файлов для копирования (name list) считывается со стандартного ввода, а каталог назначения указывается в качестве аргумента:

$ cpio -p dir2 < name_list

Команда cpio имеет множество опций, позволяющих создавать, в частности, архивы в различных форматах, в том числе для межплатформенной переносимости.На сей предмет служит опция -H [значение] или --format=значение. Спосок допустимых значений можноузнать из man cpio. Практический интерес для нас может представлять две -- tar и ustar, создающие различные варианты tar-архивов, в том числе GNU tar (см. следующую страницу).

Команда cpio может использоваться в сцепке с утилитами компрессии, такими, как gzip или lzma (описанными здесь и здесь, соответственно). Например, команда

$ find ./* | cpio -o | gzip - > file.cpio

создаст gzip-компрессированный архив -- именно таким способом создавались до недавнего времени rpm-пакеты (о которых будет говориться на соответствующей странице). Ныне же для них применяется lzma-сжатие, чего можно достигнуть следующим образом:

$ find ./* | cpio -o | lzma - > file.cpio

Раз уж речь зашла об rpm-пакетах, затронем вопрос об их “потрошении” — такая необходимость время от времени возникает не только у пользователей дистрибутивов, использующих этот формат.

На этот предмет существует специальная утилита rpm2cpio. Она считывает данные с rpm-файла (или, если таковой не указан, со стандартного ввода), преобразуя их в формат архива cpio.

Делается это так:

$ rpm2cpio  file.rpm > file.cpio

Далее образовавшийся cpio-архив распаковывается стандартным образом:

$ cpio -i -d < file.cpio

Обращаю внимание на опцию -d, предписывающую создавать промежуточные подкаталоги при распаковке архива — она почти наверняка понадобится.


Содержание


Теги: