Linuxでファイルやディレクトリをコピーするとき、多くの人が使うのがcp
コマンドです。
その中でも「cp -a
ってよく見るけど、具体的にどんな意味があるの?」「cp -r
とは何が違うの?」と思ったことはありませんか。
この記事では、cp -a
オプションの詳しい意味や-r
との違い、利用時に気をつけたいポイントまで、初心者にもわかりやすく解説します。
サーバー管理者やLinux初心者の方に役立つ実用的な内容になっていますよ!
cp -aの基本的な意味

アーカイブモードとは
cp
コマンドの-a
オプションは、以下のように使います。
cp -a <コピー元> <コピー先>
この-a
は「アーカイブ(archive)」モードの略で、元のファイル構造や属性をできる限り忠実に再現してコピーするオプションです。
-aオプションが実際に行うこと
cp -a
は、実は複数のオプションをまとめたものです。具体的には以下の機能を同時に実行します。
含まれる機能
- ディレクトリを再帰的にコピー(
-r
と同じ) - シンボリックリンクをそのままコピー(
-d
オプション) - 所有者・グループ・パーミッションを保持(
-p
オプション) - タイムスタンプを保持(作成日時、更新日時)
- 特殊ファイルもそのままコピー(デバイスファイルなど)
つまり、cp -a
はcp -dpR
と同じ動作をする便利なまとめオプションなのです。
実際の使用例
例えば、Webサーバーのドキュメントルートをバックアップする場合:
cp -a /var/www/html /backup/
この命令を実行すると、/var/www/html
以下のファイルやディレクトリを、パーミッションやタイムスタンプを保ったまま/backup/html
にコピーできます。
コピーされる情報
- ファイルとディレクトリの構造
- ファイルの内容
- 所有者とグループ
- パーミッション(読み書き実行権限)
- タイムスタンプ(作成日時、更新日時、アクセス日時)
- シンボリックリンクの情報
cp -rとの違いは?
-rオプションの動作
多くの人がディレクトリをコピーする際に-r
(または-R
)を使います。
cp -r <コピー元> <コピー先>
これはディレクトリを再帰的にコピーするだけのオプションで、パーミッションや所有者、タイムスタンプなどの属性は通常保持されません。
具体的な違いを比較
cp -rの場合
cp -r /var/www/html /backup/
- ファイルとディレクトリの構造:○ コピーされる
- ファイルの内容:○ コピーされる
- 所有者とグループ:× コピーしたユーザーのものになる
- パーミッション:△ 一部変更される場合がある
- タイムスタンプ:× 現在の時刻になる
- シンボリックリンク:× 実体がコピーされる
cp -aの場合
cp -a /var/www/html /backup/
- ファイルとディレクトリの構造:○ コピーされる
- ファイルの内容:○ コピーされる
- 所有者とグループ:○ 元のまま保持される
- パーミッション:○ 元のまま保持される
- タイムスタンプ:○ 元のまま保持される
- シンボリックリンク:○ リンクとして保持される
どちらを使うべき?
cp -rが適している場面
- 単純にファイルをコピーしたい
- 所有者やパーミッションを気にしない
- 新しいタイムスタンプをつけたい
cp -aが適している場面
- バックアップを作成する
- サーバー設定をそっくりそのまま移行する
- 開発環境を本番環境と同じ状態でコピーする
- システム管理でファイル属性を保持したい
cp -aを使うときの注意点

SELinuxのコンテキストに注意
cp -a
はSELinuxのコンテキスト(security context)までコピーしない場合があります。
対処法 RHEL系やCentOSでSELinuxを有効にしている場合は、コピー後に以下のコマンドでコンテキストを復元しましょう。
# コピー後にSELinuxコンテキストを復元
restorecon -Rv /backup/html
ハードリンクの取り扱い
cp -a
はハードリンクを維持します。これは便利な機能ですが、注意も必要です。
注意点
- ハードリンクを意識しないでコピー先を編集すると、元のファイルにも影響する
- 同じファイルが複数の場所から参照されている状態が維持される
確認方法
# ハードリンクの数を確認
ls -li /path/to/file
リンク数が1より大きい場合は、ハードリンクが存在します。
権限不足によるエラー
cp -a
で所有者やパーミッションを保持するには、適切な権限が必要です。
よくあるエラー
cp: cannot preserve ownership: Operation not permitted
対処法
- root権限で実行する(
sudo cp -a
) - または、所有者情報を諦めて
cp -r
を使う
他のOSでの互換性
cp -a
の動作はLinux固有の部分があります。
注意が必要なOS
- macOS:一部のオプションが異なる動作をする
- BSD系UNIX:完全に同じ動きをしない場合がある
- 他のUNIX系:オプションが存在しない場合もある
移植性を考える場合
# より互換性の高い方法
tar cf - /source/dir | (cd /dest && tar xf -)
ディスク容量の確認
cp -a
は元のディレクトリと同じサイズのコピーを作成します。
事前確認
# コピー元のサイズを確認
du -sh /var/www/html
# コピー先の空き容量を確認
df -h /backup
実際の活用例

Webサーバーのバックアップ
# Apacheのドキュメントルートをバックアップ
sudo cp -a /var/www/html /backup/web_$(date +%Y%m%d)
# 設定ファイルもまとめてバックアップ
sudo cp -a /etc/apache2 /backup/apache_config_$(date +%Y%m%d)
データベースファイルのコピー
# MySQLのデータディレクトリをコピー(サービス停止後)
sudo systemctl stop mysql
sudo cp -a /var/lib/mysql /backup/mysql_$(date +%Y%m%d)
sudo systemctl start mysql
開発環境の複製
# 本番環境の設定を開発環境にコピー
sudo cp -a /opt/app/production /opt/app/development
よくある質問

Q:cp -aでシンボリックリンクはどうなりますか?
A:シンボリックリンクはリンクとして保持されます。リンク先のファイルではなく、リンク自体がコピーされます。
Q:cp -aは隠しファイルもコピーしますか?
A:はい、ドットで始まる隠しファイルもすべてコピーされます。
Q:cp -aでエラーが出た場合、一部だけコピーされることはありますか?
A:はい、権限不足などでエラーが出ても、コピー可能なファイルは処理されます。-v
オプションを付けて詳細を確認することをおすすめします。
Q:cp -aの実行中に中断した場合はどうなりますか?
A:処理途中までコピーされたファイルが残ります。再実行すれば残りの処理が継続されます。
まとめ:cp -aを使いこなしてLinux操作を効率化
この記事のポイント
- cp -aはディレクトリ構造、所有者、パーミッション、タイムスタンプ、リンク情報などを保持してコピーする
- cp -rとの最大の違いは「属性までコピーするかどうか」
- SELinuxの環境やハードリンクには特に注意が必要
- バックアップやサーバー移行では cp -a が威力を発揮する
使い分けの基準
- 完全なコピーが必要:cp -a を使う
- 単純なファイルコピー:cp -r で十分
- 移植性が重要:tar コマンドを検討
Linuxサーバーの移設やバックアップでcp -a
を使いこなせば、トラブルの少ない運用ができます。
特にWebサーバーやデータベースサーバーの管理では、ファイル属性を正確に保持することが重要なので、ぜひ活用してみてください。
コメント