Утилита 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
, предписывающую создавать промежуточные подкаталоги при распаковке архива — она почти наверняка понадобится.
Содержание
Теги: cpio