cpコマンドでディレクトリごとコピーする方法|-r/-aの違いとrsync比較

バックアップ・復元

ディレクトリを丸ごとコピーしたいときは cp -r を使います。ただし、コピー先の指定方法によって挙動が変わるため注意が必要です。

一方で rsync を使えば差分コピーや属性保持も簡単にでき、大規模なファイルコピーやバックアップでは以下のコマンドとなります。

# 末尾スラッシュなし → ディレクトリごとコピーされる
cp -r src_dir destination_dir/

# 末尾スラッシュあり → 中身のみコピーされる : macOS(BSD cp)の挙動
cp -r src_dir/ destination_dir/

# rsync を使ったコピー(差分や大規模コピー向け)
rsync -a source_dir destination_dir/

💡 補足
Linux(GNU cp)では src_dirsrc_dir/ の挙動は同じですが、
macOS(BSD cp)では「中身のみコピー」になります。
クロスプラットフォームで混乱を避けたい場合は、明示的に cp -a src_dir backup/ と書くのがおすすめです。

この記事では、cp コマンドの基本と注意点、よく使うオプション、そして rsync との比較をわかりやすく解説していきます。

まずはコマンドの挙動を正しく理解して、安全に使いこなしましょう。

基本コマンドとオプション一覧

ディレクトリごとコピーする場合、最もよく使われるのは cp -r です。-r は「再帰的コピー」を意味し、ディレクトリの中身を階層ごとにコピーします。基本の使い方は以下のとおりです。

# ディレクトリごとコピーする(基本)
cp -r src_dir dst_dir/


# 実際の例
$ ls
src_dir backup
$ cp -r src_dir backup/
$ tree backup
backup/
└── src_dir
    ├── file1.txt
    └── file2.txt

cpコマンドの便利なオプション一覧

オプション意味・動作用途・ポイント
-a (--archive)属性・シンボリックリンク・タイムスタンプを保持してコピーバックアップ用途で推奨。 -r よりも完全な複製を行う
-i (--interactive)上書き時に確認を求める誤操作防止。安全にコピーしたいときに便利
-v (--verbose)コピー中のファイル名を表示進捗確認やログ出力に活用可能
-p所有者・パーミッション・タイムスタンプを保持権限維持が必要なシステムファイルのコピーに有効
-u既存ファイルより新しいものだけコピー更新処理や差分反映に便利
-n (--no-clobber)既存ファイルを上書きしない上書きを避けたいときの安全策
-Tコピー先をファイルとして扱う意図しないディレクトリ二重生成を防ぐ

-a-dR --preserve=all の省略形で、-r の上位互換と覚えておくと便利です。
実運用では「cp -av」の組み合わせが定番です。

よくある組み合わせとして、以下のような使い方があります。

# 上書き前に確認しながらコピー
cp -rvi source_dir destination_dir/

# 属性を保持してバックアップ的にコピー
cp -a source_dir destination_dir/

これらを知っておくだけで、誤操作を減らし、効率的かつ安全にディレクトリコピーを行えるようになります。

スラッシュの有無による挙動の違い :macOS(BSD cp)のみが該当

cp コマンドでディレクトリをコピーする際、末尾にスラッシュを付けるかどうかで結果が変わる点に注意が必要です。特にバックアップや自動スクリプトでは、意図しないディレクトリ構造を作ってしまう原因になります。

スラッシュ有無での挙動の違いはmacOS(BSD cp)で発生します。Linux環境では関係ありませんが、どの環境でも動かせるコマンドを作るためにはスラッシュなしでの記述を意識付けるのがおすすめです。

例1:スラッシュなし

$ cp -r source_dir destination_dir/
$ tree destination_dir/
destination_dir/
└── source_dir
    ├── file1.txt
    └── file2.txt

2 directories, 2 files
  • destination_dir/ の中に source_dir というディレクトリごとコピーされる。
  • 結果: destination_dir/source_dir/...

例2:スラッシュあり

# macOS(BSD cp)のみの挙動
$ cp -r source_dir/ destination_dir/
$ tree destination_dir/
destination_dir/
├── file1.txt
└── file2.txt

1 directories, 2 files
  • source_dir中身だけdestination_dir/ にコピーされる。
  • 結果: destination_dir/file1 destination_dir/file2 destination_dir/subdir/...

ポイント

  • スラッシュなし → 「ディレクトリごと」コピー
  • スラッシュあり → 「中身だけ」コピー

同じように見えるコマンドでも結果が大きく異なるため、コピー先の構造をどうしたいのかを意識して使い分ける必要があります。
特にバックアップスクリプトや自動処理では、スラッシュの有無を明示的に指定することが推奨されます。

💡 補足
Linux(GNU cp)では src_dirsrc_dir/ の挙動は同じですが、
macOS(BSD cp)では「中身のみコピー」になります。
クロスプラットフォームで混乱を避けたい場合は、明示的に cp -a src_dir backup/ と書くのがおすすめです。

コピー先が既存ディレクトリだった場合の注意点

cp -r を使うときにもう一つ重要なのが、コピー先ディレクトリが既に存在する場合の挙動です。意図しないディレクトリ構造を作ってしまうトラブルの多くはここで起こります。

基本的な挙動

$ ls
src_dir destination_dir
$ cp -r src_dir destination_dir/
$ tree destination_dir
destination_dir/
└── src_dir
    ├── file1.txt
    └── file2.txt


# 存在しないディレクトリへはファイルのみがコピー
$ ls
src_dir destination_dir
$ cp -r src_dir backup/
$ tree backup
backup/
├── file1.txt
└── file2.txt

  • destination_dir/ が存在する場合、source_dir はその中に 新しいサブディレクトリとしてコピーされます。
  • 結果: destination_dir/source_dir/...

よくある誤解

  • source_dir の中身だけ destination_dir にコピーされる」と思い込んでしまうケースが多い。
  • 実際には destination_dir の中にさらに source_dir ができて二重構造になりやすい。

意図通りにコピーしたい場合

  • 中身だけをコピーしたいなら、次のようにスラッシュを付ける必要があります。
    cp -r source_dir/ destination_dir/
  • 上書きではなく置き換えたい場合は、GNU cp で使える -T オプションが便利です。
    cp -rT source_dir destination_dir
    • destination_dir がディレクトリとして存在していても、「単なるコピー先」として扱われるため、意図せず二重構造になるのを防げます。

注意点のまとめ

  • コピー先に同名ディレクトリがあると、中にもう一層ディレクトリが作られる
  • 中身だけコピーするなら末尾 / を忘れない
  • 完全に置き換えるなら -T を検討

これらを理解しておくことで、特にバックアップや自動スクリプトでの事故を防げます。

実用的な組み合わせ例

単純に cp -r を実行するだけでは、上書きや権限の保持などで不便が生じることがあります。そこで、よく使われる実用的な組み合わせを紹介します。用途に応じて覚えておくと便利です。

上書き前に確認しながらコピー

cp -rvi source_dir destination_dir/
  • -r:ディレクトリごとコピー
  • -v:コピー中のファイル名を表示
  • -i:上書き前に確認を求める
    → 誤って重要なファイルを上書きしないように安全性を高めたいときに有効です。

属性を保持してバックアップ的にコピー

cp -a source_dir destination_dir/
  • -a(archive):シンボリックリンク、タイムスタンプ、パーミッションを保持
    → バックアップや復元の用途に最適です。

更新されたファイルだけをコピー

cp -ru source_dir destination_dir/
  • -u:コピー先より新しいファイルのみコピー
    → 差分バックアップに便利で、処理時間を短縮できます。

上書きせずにコピー(既存ファイルはそのまま)

cp -rn source_dir destination_dir/
  • -n:既存ファイルを上書きしない
    → 安全にファイルを追加したいときに使えます。

完全に置き換えたい場合

cp -rT source_dir destination_dir
  • -T:コピー先を「ディレクトリではなく単一のターゲット」として扱う
    → 既存の destination_dir をそのまま source_dir で置き換えたいときに有効です。

これらの組み合わせを知っておくと、シチュエーションに応じて「安全にコピーする」「効率よくコピーする」といった使い分けができるようになります。

rsync と cp の比較

cp コマンドはシンプルで手軽に使えますが、大量のファイルや定期的なバックアップでは rsync を使った方が便利なケースがあります。ここでは両者の特徴を整理します。

cp の特徴

  • シンプルで基本的なコピーが可能
  • オプションが少なく直感的に使える
  • 小規模なコピーや一時的な利用に向いている
  • ネットワーク越しのコピーには対応していない

rsync の特徴

  • 差分コピーに対応しており、2回目以降は変更されたファイルだけをコピーするため高速
  • タイムスタンプやパーミッションを保持できる(-a オプション)
  • ネットワーク越しにリモートサーバーとの同期が可能(rsync user@host:/path ./ など)
  • 中断したコピーの再開(レジューム)が可能
  • バックアップやサーバー間のファイル同期に広く利用されている

使用例の比較

# cp を使ったディレクトリコピー
cp -a source_dir/ destination_dir/

# rsync を使ったディレクトリコピー(差分対応)
rsync -a source_dir/ destination_dir/

まとめ

  • 手軽さ重視 → cp
  • 効率的なバックアップ・差分更新・リモート同期 → rsync

日常的なコピーや小さな作業では cp、継続的なバックアップや大規模なコピーでは rsync を選ぶのが実務での使い分けの目安となります。

コピー結果の確認コマンド

# コピー後に構造を確認
tree dst_dir

# ファイルの中身が一致しているか確認
diff -r src_dir dst_dir/src_dir
# 出力例(差分なし)
$ diff -r src_dir dst_dir/src_dir
$

diff -r で「完全コピーできているか」を検証できます。

トラブル時のチェックリスト

ディレクトリコピーが思ったように動作しない場合、原因は基本的な設定や環境にあることが多いです。以下のチェックリストを確認することで、多くのトラブルを解決できます。

権限の問題

  • コピー先に書き込み権限があるか確認する ls -ld destination_dir
  • 権限不足の場合は sudo を付けて実行 sudo cp -a source_dir/ destination_dir/

ディスク容量の不足

  • 空き容量が足りないとコピーは失敗します df -h
  • 必要に応じて不要ファイルを削除、もしくは別のストレージを利用する

ディレクトリ構造の誤り

  • スラッシュの有無によってコピー結果が変わる
  • コピー先が既に存在する場合、意図せず二重ディレクトリができていないか確認

上書きの確認不足

  • -i オプションを付けずに実行すると、気づかないうちにファイルを上書きしてしまうことがある
  • 安全に行うには以下のようにする cp -rvi source_dir/ destination_dir/

シンボリックリンクの扱い

  • シンボリックリンクをそのままコピーするか、中身を辿るかで結果が変わる
  • -a オプションで元のリンクを保持、-L でリンク先をコピーすることを確認

大規模コピーの失敗

  • ファイル数が多い場合は cp ではなく rsync を検討 rsync -a --progress source_dir/ destination_dir/

このチェックリストを順番に確認すれば、多くの「コピーできない」「コピー結果が違う」といったトラブルを早期に解決できます。

以下は、「他の人はこれも質問」に対応するQ&Aセクションとして、記事末尾に追加できる FAQ形式の本文ブロック です。
読者が離脱前に“他の関連疑問”も解決できる構成になっています。

よくある質問(FAQ)

Q1. フォルダごとコピーする方法は?

フォルダ(ディレクトリ)を丸ごとコピーするには、cp コマンドに -r(再帰的コピー) オプションを付けます。

cp -r フォルダ名 コピー先/

例:

cp -r project backup/

この場合、project フォルダとその中身すべてが backup 内にコピーされます。
属性も保持したい場合は、-a オプションを使うとより確実です。

cp -a project backup/

Q2. Linuxでディレクトリごとファイルをコピーするには?

Linuxの cp コマンドでは、通常のファイルコピーもディレクトリコピーも同じ構文で行えます。
ファイル単体なら cp file.txt backup/、ディレクトリなら cp -r dir backup/ です。

# ファイルをコピー
cp file.txt backup/

# ディレクトリごとコピー
cp -r dir backup/

どちらも「コピー先」に / を付けることで、ディレクトリとしてコピーされます。

Q3. Rsyncとcpの違いは?

比較項目cprsync
主な用途単純コピー差分・同期コピー
差分コピー❌ なし(常に上書き)✅ 変更分のみ転送
転送経路ローカルのみローカル/リモート両対応
進行表示-v で簡易表示デフォルトで詳細表示(-av
推奨場面一時的な複製、単発コピー定期バックアップ、リモート同期

rsync は「差分を検出して更新する」点が最大の強みです。
バックアップやサーバー間コピーには rsync -av を使うのがおすすめです。

Q4. フォルダごとコピーする xcopy コマンドは?

xcopyWindows でフォルダごとコピーするためのコマンドです。
Linux では cp -r が対応します。

# Windows の場合
xcopy C:\project D:\backup /E /I /H

主なオプション:

オプション意味
/E空フォルダも含めてコピー
/Iコピー先がフォルダであると仮定
/H隠しファイルやシステムファイルもコピー

LinuxとWindowsでコマンドが異なるだけで、目的は同じです。
どちらも「フォルダを丸ごと複製する」ための手段です。

まとめ

ディレクトリごとコピーするには cp -r が基本ですが、スラッシュの有無コピー先ディレクトリの存在によって挙動が変わるため注意が必要です。さらに、上書き確認(-i)、属性保持(-a)、差分コピー(-u)、上書き防止(-n)など、目的に合わせたオプションを組み合わせることで、安全で効率的なコピーが実現できます。

大規模なバックアップやリモートとの同期が必要な場合は、rsync を使うことで処理速度や信頼性を高められます。

コピーの仕組みを理解して使い分ければ、意図しないファイル構造や上書き事故を防ぎ、日常的な作業からシステム管理まで安心して活用できます。

関連記事:ファイル操作やバックアップの基礎をもっと学ぶ

cpコマンドでのディレクトリコピーを理解したら、ファイル管理やバックアップ関連の操作も押さえておくと便利です。bash道では以下の記事で詳しく解説しています。

ファイル・ディレクトリ操作の基本

バックアップ・同期に役立つコマンド

システム管理の基礎もチェック

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする