Linuxコマンド cpio(アーカイブへコピー/アーカイブからコピーする)

標準入力からのファイルリストを対象にアーカイブファイルへのファイルのコピーや、アーカイブファイルからファイルへのコピーを行うcpioコマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

複数ファイルをcpio形式にまとめる機能となる。cpioは元々、テープ・デバイス上で連続的にバックアップ・ファイル・アーカイブを保存できるよう設計されているが、tarと同様にアーカイブの圧縮はしません。そのため、gzip等の外部圧縮プログラムを利用して圧縮を行う。慣習的にcpioアーカイブの拡張子は「.cpio」となる。

また、圧縮した場合は慣習的に「.cpgz」または「.cpio.gz」という拡張子とする。

アーカイブを作成する場合は、標準入力からのファイルリストを処理対象とします。アーカイブから展開する場合は標準出力か-Fオプションで指定したデバイスに展開出力します。

デフォルトでは、cpio形式のアーカイブになりますが、tarアーカイブも扱えます。

最近は、アーカイバとしてよりもRPMファイルの展開に多用します。

書式

コピーアウトモード(copy-out mode)

$cpio -o [オプション] <ファイルリスト> [アーカイブ]

コピーインモード(copy-in mode)

$cpio -i [オプション] [アーカイブ]

コピーパスモード(copy-pass mode)

$cpio -p [オプション] [アーカイブ]

モード

cpioコマンドには主にコピーアウトモード、コピーインモード、コピーパスモードの3つの機能があります。

-o
–create
コピーアウトモード
(copy-out mode)
ファイルに格納するモード。アーカイブを作成する
-i
–extract
コピーインモード
(copy-in mode)
ファイルから展開するモード。アーカイブからファイルを取り出す
-p
–pass-through
コピーパスモード
(copy-pass mode)
copy-passモード。アーカイブにせつずに別ディレクトリなどに
ファイルをそのままコピーする
モード一覧表

オプション

-A,
–append
-d,
–make-directories
必要な場合にディレクトリを作成する
-l アーカイブファイル標準入力の代わりに指定したアーカイブファイルを使用する
-v,
–verbose
処理されたファイル一覧を表示する。-tオプションと併用すると「is -l」と同じ出力になる
-a入力ファイルのアクセス時間をリセットする
-mファイルの変更時間を修正しない
–no-preserve-ownerコピーイン/コピーパスモードでファイルの所有者を変更しない
-O アーカイブファイル標準出力の代わりに指定したアーカイブファイルを使用する
-r,
–rename
対話的にファイル名を変更する
-R [ユーザ名.グループ名],
–owner [ユーザ名.グループ名]
生成ファイルのオーナーユーザ名/グループ名を指定する
-t,
–list
入力ファイルの一覧を表示する
–nullNULL文字をファイル区切りとして扱う
モード一覧表

【基本使用例】

アーカイブ

カレントディレクトリにあるファイルをbackup.cpioとしてアーカイブする

※ディレクトリ内は再帰的にコピーされない

ls | cpio -o > ./backup.cpio

実行結果

[centos@work sample]$ls | cpio -o > ./backup.cpio
1 block
[centos@work sample]$ls
backup.cpio  http1.log  http2.log
[centos@work sample]$ 

展開

アーカイブファイルをディレクトリに戻す。また、-vオプションを付ければファイルリストが出力される。-dを付けることにより必要なディレクトリが作成される。

cpio -i < backup.cpio

実行結果

[centos@work sample]$cpio -i < backup.cpio
1 block
[centos@work sample]$ls
backup.cpio  http1.log  http2.log
[centos@work sample]$ 

アーカイブに含まれているファイルを一覧表示する

backup.cpioファイルに含まれているファイルの一覧を表示します。

サンプル

$cpio -t < ./backup.cpio

実行結果

[centos@work sample]$cpio -t < ./backup.cpio
backup.cpio
http1.log
http2.log
1 block
[centos@work sample]$ 

カレントディレクトリ以下を再帰的にアーカイブ化

findコマンドを使用します。

サンプル

$find . | cpio -o >backup.cpio

実行結果

[centos@work sample]$ls
sample
[centos@work sample]$ 
[centos@work sample]$ 
[centos@work sample]$find . | cpio -o >backup.cpio
1 block
[centos@work sample]$ls
backup.cpio  sample
[centos@work sample]$cpio -t < ./backup.cpio
.
sample
sample/http1.log
sample/http2.log
backup.cpio
1 block
[centos@work sample]$ 

ソースRPMパッケージを展開する

rpm2cpioでrpmからcpioを抽出する。cpioアーカイブをcpioに渡して展開する。

サンプル

$rpm2cpio ruby-1.8.7-p334.src.rpm | cpio -id

実行結果

[centos@work sample]$rpm2cpio ruby-1.8.7-p334.src.rpm | cpio -id
10447 blocks
[centos@work sample]$ls
backup.cpio  ruby-1.8.7-p334.src.rpm  rubyfaq-990927.tar.bz2     ruby-man-1.4.6.tar.bz2  ruby-refm-rdp-1.8.1-ja-html.tar.gz  sample
irb.1        ruby-1.8.7-p334.tar.bz2  rubyfaq-jp-990927.tar.bz2  ruby-mode-init.el       ruby.spec
[centos@work sample]$ 

パススルーを利用する

ファイルを指定してアーカイブを使わずに新しくディレクトリを作成し、ファイルをコピーする。findを使用することで、空白などの特殊文字を使ったファイル名も対応できる。

サンプル

$find . -type f -print0 | cpio --null -pvd newdir

実行結果

[centos@work sample]$find . -type f -print0 | cpio --null -pvd newdir
newdir/./sample/http1.log
newdir/./sample/http2.log
newdir/./backup.cpio
newdir/./ruby-1.8.7-p334.src.rpm
newdir/./irb.1
newdir/./ruby-1.8.7-p334.tar.bz2
newdir/./ruby-man-1.4.6.tar.bz2
newdir/./ruby-mode-init.el
newdir/./ruby-refm-rdp-1.8.1-ja-html.tar.gz
newdir/./ruby.spec
newdir/./rubyfaq-990927.tar.bz2
newdir/./rubyfaq-jp-990927.tar.bz2
20876 blocks
[centos@work sample]$ls
backup.cpio  newdir                   ruby-1.8.7-p334.tar.bz2  rubyfaq-jp-990927.tar.bz2  ruby-mode-init.el                   ruby.spec
irb.1        ruby-1.8.7-p334.src.rpm  rubyfaq-990927.tar.bz2   ruby-man-1.4.6.tar.bz2     ruby-refm-rdp-1.8.1-ja-html.tar.gz  sample
[centos@work sample]$ 

cpio: xxx.cpio not createdエラー

「cpio: xxx.cpio not created: newer or same age version exists」というエラーが表示する場合は、同一のディレクトリに展開する同名のファイルがある場合はエラーが表示されます。

[centos@work sample]$ls
backup.cpio ←すでにcpioのファイルが存在しているためエラーが表示
[centos@work sample]$cpio -i < backup.cpio
cpio: backup.cpio not created: newer or same age version exists
1 block
[centos@work sample]$