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はユーザにプロンプトを返すことなく直ちに処理を実行する。以下同様）。

```bash
$ find . -depth -print | cpio  -o > archive.cpio
```

cpioが生成するアーカイブはファイルとディレクトリのストリームを連続的に単一のアーカイブに収めたものである。アーカイブはファイルメタ情報を含むヘッダ・セクション毎にデータを分離できる。そのようなファイルメタ情報とは、ファイル名、inode番号、ファイル所有者、パーミッションそしてタイムスタンプである。cpioはアーカイブのヘッダ情報に従いファイルやディレクトリをファイルシステム上に展開する（オプションで無視することもできる）。慣習的に、cpioアーカイブはしばしば拡張子`.cpio`をアーカイブ・ファイル名の末尾に持つ。

### 展開
cpioは、*-i*オプションを付して*コピーイン*（*copy-in*）モードで起動した場合、標準入力からアーカイブを読み取り、ファイルシステム上にアーカイブ済みファイルを再生成する。次に示すコマンド例を実行するとその様子が把握できる。

```bash
$ cpio -id < archive.cpio
```

上記の*-d*フラグはcpioに必要に応じて（すなわち、存在しなければ）ディレクトリを作成するよう指示する。また抽出されたファイル名を出力する*-v*フラグもある。

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

```bash
$ cpio -id etc/fstab < archive.cpio
```


### リスト
展開前にcpioアーカイブ内に含まれるファイルの一覧を出力するには、

```bash
$ cpio -it < archive.cpio
```

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

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

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

```bash
$ 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