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 | 入力ファイルの一覧を表示する |
–null | NULL文字をファイル区切りとして扱う |
【基本使用例】
アーカイブ
カレントディレクトリにあるファイルを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]$