Linux: cpio — управление архивами .cpio

Автор: | 02/29/2016
 

linux_logocpio — утулита для управления архивами а так же расширение файлов архивов.
Аббревиатура cpio расшифровывается как «copy in, copy out«.

cpio используется для трех основных задач:

  • копирование файлов в архив (-o — copy-out mode);
  • извлечение данных из архива (-icopy-in mode);
  • передача файлов в другое дерево каталогов (-pcopy-pass mode).

Во время создания архива cpio принимает список файлов из STDIN, а при распаковке — передает их в STDOUT.

Создание *.cpio архива

Для создания архива — используется опция -o:

'-o, --create'
    Run in copy-out mode

Например:

$ touch file{1,2,3}.txt
$ ls -l
total 0
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:33 file1.txt
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:33 file2.txt
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:33 file3.txt

С помощью ls — получаем имя каждого файла в текущей директории, и передаем их на вход cpio:

$ ls | cpio -o > filesarch.cpio
1 block
$ ls -l
total 4
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:33 file1.txt
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:33 file2.txt
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:33 file3.txt
-rw-r--r-- 1 setevoy setevoy 512 Feb 29 11:35 filesarch.cpio

Можно указать -v (--verbose) для более подробной информации:

$ ls | cpio -ov > filesarch.cpio
file1.txt
file2.txt
file3.txt
filesarch.cpio
1 block

Что бы добавить к архиву только определенные файлы — выполните выборку перед передачей имен в pipe.

Например:

$ ls | grep '2\|3' | cpio -ov > filesarch.cpio
file2.txt
file3.txt
1 block

Или:

$ find . -name '*2.txt' -o -name '*3.txt' | cpio -ov > filesarch.cpio
./file2.txt
./file3.txt
1 block

Что бы сохранить информацию об  mtime (Modification Time) — добавьте опцию -m.

Извлечение *.cpio архивов

Для извлечения файлов из архива — используется опция -i:

'-i, --extract'
    Run in copy-in mode.

Например:

$ rm -v file*.txt
removed 'file1.txt'
removed 'file2.txt'
removed 'file3.txt'
$ cpio -iv < filesarch.cpio 
file1.txt
file2.txt
file3.txt
cpio: filesarch.cpio not created: newer or same age version exists
filesarch.cpio
1 block
$ ls -l
total 4
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:46 file1.txt
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:46 file2.txt
-rw-r--r-- 1 setevoy setevoy   0 Feb 29 11:46 file3.txt
-rw-r--r-- 1 setevoy setevoy 512 Feb 29 11:35 filesarch.cpio

Для извлечения только определенный файл — передайте его (или маску для имен файлов) аргументом.

Например:

$ cpio -iv < filesarch.cpio file3.txt
file3.txt
1 block
$ cpio -iv < filesarch.cpio file{1,2}.txt
file1.txt
file2.txt
1 block

Просмотр содержимого *.cpio архива

Для просмотра содержимого архива — используйте опцию -t:

'-t, --list'
    Print a table of contents of the input.

Например:

$ cpio -it < filesarch.cpio 
file2.txt
file3.txt
1 block

Копирование дерева директорий

cpio так же позволяет выполнить копирование каталога и всех вложенных данных без необходимости создавать промежуточный архив.

Например:

$ find . -name "*.txt" | cpio -vpdm /tmp/2
/tmp/2/./file2.txt
/tmp/2/./file1.txt
/tmp/2/./file3.txt
0 blocks
$ ls -l /tmp/2/
total 0
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:48 file1.txt
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:48 file2.txt
-rw-r--r-- 1 setevoy setevoy 0 Feb 29 11:49 file3.txt

Тут -p — Copy-pass mode, -m — сохранить информацию об mtime файлов, и -d — создавать каталоги при необходимости.

cpio и другие форматы

cpio поддерживает работу с форматами данных.

Например, для создания tar-архива — укажите tar после поции -H (--format):

$ find . -name "*.txt" | cpio -ov -H tar > filesarch.tar
./file2.txt
./file1.txt
./file3.txt
5 blocks
$ tar tf filesarch.tar 
file2.txt
file1.txt
file3.txt

Хотя и *.cpio для tar давно не проблема:

$ tar tf filesarch.cpio 
file2.txt
file1.txt
file3.txt

Ссылки по теме

http://linux.die.net