ディレクトリを丸ごとコピーしたいときは 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_dirとsrc_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_dirとsrc_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_dirdestination_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の違いは?
| 比較項目 | cp | rsync |
|---|---|---|
| 主な用途 | 単純コピー | 差分・同期コピー |
| 差分コピー | ❌ なし(常に上書き) | ✅ 変更分のみ転送 |
| 転送経路 | ローカルのみ | ローカル/リモート両対応 |
| 進行表示 | -v で簡易表示 | デフォルトで詳細表示(-av) |
| 推奨場面 | 一時的な複製、単発コピー | 定期バックアップ、リモート同期 |
rsync は「差分を検出して更新する」点が最大の強みです。
バックアップやサーバー間コピーには rsync -av を使うのがおすすめです。
Q4. フォルダごとコピーする xcopy コマンドは?
xcopy は Windows でフォルダごとコピーするためのコマンドです。
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道では以下の記事で詳しく解説しています。
ファイル・ディレクトリ操作の基本
- mvコマンドでファイルやフォルダを移動・リネームする方法
→ ファイル整理や一括移動に使えるmvの基本と安全な使い方。 - rmコマンドで安全に削除する方法|誤削除防止のオプション解説
→rm -rfの危険性と、削除前に確認するためのコマンド例を紹介。 - mkdirコマンドでディレクトリを作成する|階層ごとの作成と権限設定
→ フォルダ構造を効率的に作るmkdir -pの使い方を実例で説明。
バックアップ・同期に役立つコマンド
- rsyncコマンドの基本と便利なオプション|差分コピー・同期の定番
→cpより高機能な差分コピーツール。rsync -avの実用例を紹介。 - scpコマンドでリモートサーバーにファイルを転送する
→ SSH経由で安全にファイルを送る基本と、ポート指定など応用例も掲載。 - tarコマンドでフォルダをまとめて圧縮・解凍する方法
→tar -czf/tar -xzfでバックアップを効率化。
システム管理の基礎もチェック
- chmodコマンドでファイルの権限を変更する
→ コピー後の権限エラーを防ぐための基礎知識。 - 権限エラーの基本と直し方
→ エラー発生時に所有者を戻すときに役立つ。
