Cpio

cpioは、ファイルアーカイバ・ユーティリティ並びにそのアーカイバで使われるファイルフォーマットである。主にUnix系オペレーティングシステムにインストールされることが多い。cpioは当初、"Programmer's Workbench"（PWB/UNIX）付属のテープメディア・アーカイブ・プログラムとして設計され、その後リリースされたUnix系OSのほとんど全てにコンポーネントとして含まれている。コマンドの名称はcopy in and out（入力複製と出力複製、コピー・インとコピー・アウト）という言い回しに由来し、cpioが動作中に標準入出力（standard I/O）を利用する様子を描写している。

全てのUNIXならびにその派生は、cpioよりよく知られておりResearch Unixに由来するtarのようなその他のバックアップ・プログラム、アーカイブ・プログラムもサポートしている。cpioはRPM Package Manager（rpm）パッケージのアーカイブ形式として利用されたり、Linuxカーネル2.6系列の起動用RAMイメージに使われるアーカイブ形式としてArch Linuxのmkinitcpio
やDebianのinitramfs-tools
で利用されたり、Appleのpaxインストーラで使われるアーカイブフォーマットとして採用されるなど、一部では依然重要な位置を占めている。

オラクルはかつて同社のソフトウェアの大半をcpioフォーマットのアーカイブで頒布していたこともある。

当初のプログラム設計により、cpioとそのアーカイブ・ファイル・フォーマットは何度も仕様変更されており、時に互換性の無い変更も加えられてしまっている。最も有名な仕様改変は、アーカイブ・ファイルのメタ情報がバイナリ・フォーマットからASCIIベース表現（char）に変わったことである（ただし操作用オプション（--format）で切り替えることで両フォーマットに対応している実装もある）。

操作とアーカイブ・フォーマット 
cpioはテープ・デバイス上で連続的にバックアップ・ファイル・アーカイブを保存できるよう設計されているが、tarと同じくアーカイブ・コンテンツの圧縮は行わない。このため適宜gzipやその他外部圧縮プログラムを利用して、cpioから生成されたアーカイブに圧縮を掛ける（この時、.cpgzまたは.cpio.gzという拡張子をファイル名の末尾に付す場合がある）。

アーカイブの作成 
cpioを-oコマンドライン・フラグと共に起動しコピーアウト（copy-out）・オペレーション・モードでアーカイブを作成する場合、標準入力を通してファイル/ディレクトリ・パス名を読み取り、標準出力にバイト・ストリームとしてアーカイブを書き出す。このため、cpioはfindプログラムのようなアーカイブ対象ファイルの一覧を生成する他のユーティリティと同時に利用するのが一般的である。以下のコマンドを実行すると、findコマンドを利用しカレント・ディレクトリの全ファイルのリストを標準出力経由でcpioに渡し、cpioはディレクトリ・ツリーごと完全にアーカイブする（このコマンド実行中、cpioはユーザにプロンプトを返すことなく直ちに処理を実行する。以下同様）。
$ find . -depth -print | cpio  -o > archive.cpio
cpioが生成するアーカイブはファイルとディレクトリのストリームを連続的に単一のアーカイブに収めたものである。アーカイブはファイルメタ情報を含むヘッダ・セクション毎にデータを分離できる。そのようなファイルメタ情報とは、ファイル名、inode番号、ファイル所有者、パーミッションそしてタイムスタンプである。cpioはアーカイブのヘッダ情報に従いファイルやディレクトリをファイルシステム上に展開する（オプションで無視することもできる）。慣習的に、cpioアーカイブはしばしば拡張子.cpioをアーカイブ・ファイル名の末尾に持つ。

展開 
cpioは、-iオプションを付してコピーイン（copy-in）モードで起動した場合、標準入力からアーカイブを読み取り、ファイルシステム上にアーカイブ済みファイルを再生成する。次に示すコマンド例を実行するとその様子が把握できる。
$ cpio -id < archive.cpio
上記の-dフラグはcpioに必要に応じて（すなわち、存在しなければ）ディレクトリを作成するよう指示する。また抽出されたファイル名を出力する-vフラグもある。

オプションを除く他全てのコマンドライン引数にはシェルライクなグロブパターンが利用できる。1つかそれ以上のパターンにマッチするファイル名を持つファイルのみをアーカイブから取り出しコピーできる。次の例は、アーカイブから"etc/"というパターンにマッチするファイル名を持つものを取り出す。
$ cpio -id etc/fstab < archive.cpio

リスト 
展開前にcpioアーカイブ内に含まれるファイルの一覧を出力するには、
$ cpio -it < archive.cpio
cpioアーカイブはファイルが相対パスだけではなく絶対パスで格納される（例えば、/bin/ls vs. bin/ls）場合があるので、事前にファイル一覧をチェックすることは有用である。

コピー 
cpioは-pオプションを付すことで、第3の操作モードであるコピーパス（コピースルー）モードで起動する。このモードは実際にファイルにアーカイブすることなくコピーアウト、コピーイン・ステップを組み合わせ、あるディレクトリ・ツリーからファイルをコピーすることを可能にする。このモードでは、cpioはコピーアウト・モード同様、標準入力上でパス名を読み取るが、アーカイブを作成せず代わりにコマンドライン引数の一部として与えられたパスに相当するファイルシステム上の別のディレクトリにディレクトリ並びにファイルを再生成する。

次のコマンド例は、カレント・ディレクトリを起点にファイルシステム上の別のディレクトリ（ディレクトリ・パスは new-path）にカレント・ディレクトリ・ツリーごとコピーし、ファイル・パーミッションを保存（-m）、必要に応じてディレクトリを作成（-d）、ユーザにプロンプトすることなく無条件で存在するファイルを上書き（-u）し、そして標準出力に処理済ファイルの一覧を出力する（-v）。cpioは標準入力からはコピー元であるカレント・ディレクトリ・ツリーの全ファイルのパス名リストを読み込んでいる。
$ find . -depth -print | cpio -pdumv new-path

POSIX標準 
cpio形式はPOSIX.1-1988にて標準化されているが、cpioユーティリティ自体は標準化されていない。POSIX標準ではcpioユーティリティの代替ソフトウェアとしてpaxユーティリティがcpioアーカイブの読み書きに利用可能と規定されている。

実装 
ほぼ全てのLinuxディストリビューションはGNUプロジェクト版のcpioを提供している。FreeBSDとmacOSではBSDライセンス下にあるcpioとlibarchiveライブラリを利用している。

脚注

関連項目 
 UNIXユーティリティの一覧

外部リンク 
 
 Manpage of CPIO - JM Project
 FreeBSD cpio(1) manual
 GNU cpio manual
 GNU cpioウェブサイト
 TAR vs. CPIO
 Format of CPIO Archives

データ圧縮規格
パッケージ管理システム
解凍ソフト
UNIXのソフトウェア
GNUプロジェクト