Linuxのcpコマンド -aオプションとは?違いと注意点を徹底解説

Linux

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 -acp -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サーバーやデータベースサーバーの管理では、ファイル属性を正確に保持することが重要なので、ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました