cpioコマンドの使い方完全ガイド!Linuxでアーカイブ作成・展開をマスターしよう
生徒
「Linux(リナックス)でファイルをまとめてバックアップしたいのですが、tar(ター)以外に方法はありますか?」
先生
「それならcpio(シーピーアイオー)コマンドという便利な道具がありますよ。古い歴史を持つコマンドですが、今でもバックアップやパッケージ管理の裏側で現役で活躍しています。」
生徒
「cpio(シーピーアイオー)ですか。何だか難しそうな名前ですね。初心者でも使いこなせるでしょうか?」
先生
「基本的な考え方さえ分かれば難しくありません。find(ファインド)コマンドと組み合わせて使うのが定番なんです。一緒に使い方を見ていきましょう!」
1. cpioコマンドとは?
Linux(リナックス)におけるcpio、読み方はcpio(シーピーアイオー)とは、「Copy In and Out(コピー・イン・アンド・アウト)」の略称です。複数のファイルを一つのファイルにまとめたり(アーカイブ化)、逆にまとまったファイルから元のファイルを取り出したり(展開)するために使用されるコマンドです。
Windows(ウィンドウズ)でいうところの「Zip(ジップ)形式の圧縮フォルダ」を作る作業に似ていますが、cpio(シーピーアイオー)自体にはファイルを小さくする「圧縮」の機能は標準ではなく、あくまで「一つにまとめる」というアーカイブ作成が主な役割となります。
歴史は非常に古く、Unix(ユニックス)の初期から存在しています。現代のLinux(リナックス)環境でも、OSの起動時に使われるinitramfs(イニットラムエフエス)という仕組みの中で使われていたり、RPM(アールピーエム)パッケージの中身として利用されていたりと、非常に信頼性の高い技術です。
2. cpioコマンドの最大の特徴とメリット
多くの初心者は「tar(ター)コマンドと何が違うの?」と疑問に思うかもしれません。cpio(シーピーアイオー)の最大の特徴は、標準入力からファイル名のリストを受け取って処理するという点にあります。
つまり、「どのファイルをアーカイブにするか」を別のコマンド(主にfindコマンドなど)から渡してあげる必要があるのです。一見すると手間がかかるように見えますが、これにより「特定の条件に合うファイルだけを複雑に抽出してバックアップする」といった高度な操作が、他のコマンドとの組み合わせ(パイプ処理)で簡単に実現できます。
また、cpio(シーピーアイオー)はデータの破損に対して比較的強く、アーカイブの一部が壊れていても、壊れていない部分のファイルを取り出せる可能性が高いという堅牢性も備えています。
3. アーカイブを作成する「copy-out」モード
まずは、複数のファイルを一つにまとめるアーカイブ作成の方法を学びましょう。これをcopy-out(コピー・アウト)モードと呼び、オプションには -o を使用します。
前述の通り、cpio(シーピーアイオー)は自分自身でファイルを探しに行くのではなく、標準入力からファイル名をもらいます。そのため、ls(エルエス)やfind(ファインド)の結果をパイプ(|)で渡すのが一般的です。
以下の例では、カレントディレクトリにある全てのテキストファイルを backup.cpio という名前のアーカイブファイルにまとめます。
ls *.txt | cpio -o > backup.cpio
2 blocks
上記のコマンドでは、ls(エルエス)で出力されたテキストファイルの一覧を cpio -o に渡し、その結果を >(リダイレクト)を使ってファイルに保存しています。最後に表示される「blocks」は、処理されたデータのサイズ目安を示しています。
4. findコマンドと組み合わせて高度なバックアップ
実務で最もよく使われるのが、find(ファインド)コマンドとの連携です。ディレクトリの中身を再帰的に(子フォルダまで含めて)アーカイブしたい場合は、find(ファインド)を使いましょう。
例えば、documents というディレクトリ内の全てのファイルを一つのアーカイブにする手順は以下の通りです。ここでは、-v オプションを付けて、どのファイルが処理されているかを表示(詳細表示:バーボス)させてみます。
find documents -print | cpio -ov > documents_backup.cpio
documents
documents/file1.pdf
documents/memo.txt
documents/image.png
8 blocks
-print(プリント)はファイル名を表示するオプションですが、find(ファインド)では省略しても同様の動作になります。このように、複雑な条件(例えば「更新日時が7日以内」など)でファイルを絞り込んでから cpio(シーピーアイオー)に渡すことで、自由自在なバックアップが可能になります。
5. アーカイブの中身を確認する「copy-pass」モード
作成したアーカイブファイルを展開する前に、中にどのようなファイルが含まれているかを確認したいことがあります。その場合は、list(リスト)表示を行います。オプションは -t を使用します。
展開(解凍のような作業)を行う前に、中身をチェックする習慣をつけることで、予期せぬ場所にファイルが上書きされるミスを防ぐことができます。
cpio -it < documents_backup.cpio
documents
documents/file1.pdf
documents/memo.txt
documents/image.png
8 blocks
ここでは <(リダイレクト)を使って、作成したアーカイブファイルを cpio(シーピーアイオー)に読み込ませています。-i は入力(展開)モードを指し、そこに -t を加えることで「展開せずに一覧だけ出す」という命令になります。
6. アーカイブを展開(解凍)する「copy-in」モード
次に、一つにまとめたファイルから元のディレクトリ構造やファイルを取り出す方法を学びましょう。これをcopy-in(コピー・イン)モードと呼び、オプションには -i を使用します。
注意点として、デフォルトではディレクトリが存在しない場合に自動で作ってくれないことがあります。そのため、-d(ディレクトリ作成)オプションをセットで使うのが一般的です。
cpio -id < documents_backup.cpio
8 blocks
これで、現在の場所に documents フォルダとその中身が復元されます。もし、既存のファイルを強制的に上書きして展開したい場合は、さらに -u(アンコンディショナル)オプションを追加します。システム管理者が設定ファイルを復旧させる際などは、管理者権限(ルート)で実行することもあります。
cpio -idu < /root/config_backup.cpio
120 blocks
上記のように root(ルート)ユーザーで実行する場合は、権限の強い操作になるため、対象のファイル名に間違いがないか慎重に確認しましょう。
7. ファイルを別の場所に直接コピーする
cpio(シーピーアイオー)には、アーカイブファイルを作らずに、ディレクトリツリーをそのまま別の場所へ丸ごとコピーするcopy-pass(コピー・パス)モードもあります。オプションは -p を使います。
これは cp(シーピー)コマンドの -r オプションに似ていますが、所有権やパーミッション(権限)を保持したまま高速にコピーできるため、大きなデータの移動に適しています。
find my_data -depth | cpio -pd /mnt/backup_disk/
500 blocks
このコマンドでは、my_data ディレクトリの内容を、別のディスクである /mnt/backup_disk/(エムエヌティー・バックアップ・ディスク)へ直接コピーしています。-depth(デプス)はディレクトリ自身よりも先にその中身を処理する指定で、コピー作業ではよく推奨される指定方法です。
8. cpioコマンドでよく使われるオプション一覧表
ここまで紹介したオプションを整理しました。これらを組み合わせることで、Linux(リナックス)でのファイル管理が非常にスムーズになります。
| オプション | 意味・読み方 | 役割 |
|---|---|---|
| -o | output(アウトプット) | アーカイブを作成する(copy-outモード) |
| -i | input(インプット) | アーカイブを展開する(copy-inモード) |
| -p | pass(パス) | 別のディレクトリへ直接コピーする(copy-passモード) |
| -d | make-directories(メイク・ディレクトリ) | 展開時に必要なディレクトリを自動作成する |
| -v | verbose(バーボス) | 処理中のファイル名を画面に表示する |
| -t | list(リスト) | アーカイブの内容を一覧表示する |
| -u | unconditional(アンコンディショナル) | 既存のファイルを警告なしに上書きする |
9. 実践!圧縮ファイルとして保存する方法
冒頭で「cpio(シーピーアイオー)には圧縮機能がない」とお伝えしましたが、Linux(リナックス)では他のコマンドと繋げることで、簡単に圧縮アーカイブを作ることができます。最も一般的なのは gzip(ジー・ジップ)との組み合わせです。
ファイルサイズを節約して保存したい場合は、以下のように記述します。
find . -print | cpio -o | gzip > full_backup.cpio.gz
1024 blocks
逆に、この圧縮された .gz(ジー・ゼット)ファイルを展開するときは、まず gunzip(ガン・ジップ)で解凍してから cpio(シーピーアイオー)に流し込みます。
gunzip -c full_backup.cpio.gz | cpio -id
1024 blocks
このように、一つの機能を追求したシンプルな道具を組み合わせて強力な処理を行うのが、Linux(リナックス)の醍醐味であり、「Unix(ユニックス)哲学」と呼ばれる考え方です。初心者の方も、このパイプ処理(|)に慣れてくると、一気に操作の幅が広がりますよ。
まとめ
今回の記事では、Linux(リナックス)環境における強力なアーカイブツールであるcpio(シーピーアイオー)コマンドの使い方について詳しく解説しました。
日常的なバックアップ作業からシステム管理まで、幅広く活用されるこのコマンドの本質は「標準入力を受け取って柔軟に処理する」という点にあります。
tar(ター)コマンドと比較されることが多いですが、find(ファインド)コマンドとの親和性が非常に高く、特定の条件に基づいたファイル抽出が容易であるという独自の強みを持っています。
cpio(シーピーアイオー)コマンドの重要ポイント再確認
効率的なファイル管理とシステム保守のために、以下の主要な3つのモードを確実にマスターしておきましょう。 これらを使い分けることで、データの移行やバックアップの自動化が飛躍的に楽になります。
- copy-outモード(-o):標準入力からファイルリストを読み込み、一つのアーカイブファイルを作成します。
- copy-inモード(-i):既存のアーカイブファイルから内容を展開、または一覧表示(-t)します。
- copy-passモード(-p):中間ファイルを作らず、ディレクトリツリーを別の場所へ直接コピーします。
実務で役立つ応用テクニック
現場では、単体で使うよりも他のコマンドと組み合わせる「パイプ処理」が主流です。
特に、ストレージ容量を節約するためにgzip(ジー・ジップ)で圧縮したり、ネットワーク越しにデータを転送したりする際に、その真価を発揮します。
例えば、大容量のログファイルを抽出してアーカイブし、さらに圧縮して保存する一連の流れは、Linux(リナックス)エンジニアにとって必須のスキルと言えるでしょう。
シェルスクリプトでの活用例
自動バックアップツールなどを自作する場合、以下のようなシェルスクリプト(Shell Script)形式で記述することが一般的です。 特定のディレクトリを除外したり、特定の拡張子だけを集めたりする柔軟な記述が可能です。
#!/bin/bash
# バックアップ対象のディレクトリ
SOURCE_DIR="/var/www/html"
# 保存先のファイル名
BACKUP_FILE="/tmp/web_backup_$(date +%Y%m%d).cpio.gz"
# findで見つけたファイルをcpioでまとめ、gzipで圧縮して保存
find $SOURCE_DIR -name "*.php" -o -name "*.html" | cpio -o | gzip > $BACKUP_FILE
echo "バックアップが完了しました: $BACKUP_FILE"
このように、cpio(シーピーアイオー)は非常に軽量かつ高速であり、システムの深部でも利用されている理由がよく分かります。
新しいコマンドを覚える際は、実際に自分の環境で試してみることが一番の近道です。
まずは、不要なテキストファイルを集めてアーカイブ化する練習から始めてみてください。
生徒
「先生、ありがとうございました!cpio(シーピーアイオー)って、最初は tar(ター)があれば十分だと思っていましたが、find(ファインド)と組み合わせることで真価を発揮するんですね。すごく自由度が高い気がします。」
先生
「その通りです!find(ファインド)で『1GB以上のファイルだけ』とか『過去24時間以内に更新されたものだけ』と条件を絞ってから、そのまま cpio(シーピーアイオー)に渡せるのが大きな利点ですね。柔軟性は tar(ター)よりも高い場面が多いですよ。」
生徒
「なるほど。あと、-p(パス)モードというのも驚きました。普通に cp -r でコピーするのと何が違うんですか?」
先生
「良い質問ですね。cpio -p は、ファイルの所有権やタイムスタンプ、パーミッション、シンボリックリンクなどの属性を非常に正確に維持したままコピーできるんです。システム移行などで『中身をそのまま別のディスクに移したい』という時に、とても信頼されている手法なんですよ。」
生徒
「属性を壊さずに移動できるのは、サーバー管理ではすごく重要ですね!あと、圧縮をしたいときは gzip(ジー・ジップ)などの他のコマンドとパイプで繋げばいいというのも、Linux(リナックス)らしくて面白いです。」
先生
「まさに、それがUnix哲学の『一つのことをうまくやる』という考え方です。cpio(シーピーアイオー)はアーカイブに徹し、gzip(ジー・ジップ)は圧縮に徹する。これらを組み合わせることで、どんな複雑な要望にも応えられるようになります。ぜひ、色々なオプションを試して、コマンドライン操作に慣れていってくださいね。」
生徒
「はい!まずは自分のホームディレクトリにあるドキュメントを find(ファインド)で探して、cpio(シーピーアイオー)でバックアップする練習をしてみます。ありがとうございました!」