Linuxでファイルやディレクトリをコピーするとき「既に同じ名前のファイルがあったらどうなるの?」「大切なファイルを間違って上書きしないか心配」と気になることはありませんか。
こんな場面で必要になります
- バックアップファイルを最新版に更新したい
- 設定ファイルを他のサーバーにコピーしたい
- 開発プロジェクトを別の場所に同期したい
- 古いファイルを新しいバージョンで置き換えたい
- 間違って上書きしないよう慎重にコピーしたい
この記事では、Linuxでよく使うcp
とrsync
を使って、上書きコピーを安全かつ効率的に行う方法を初心者にもわかりやすく解説します。
基本から応用まで網羅しているので、これを読めばLinuxでのファイルコピーがずっと楽になりますよ!
上書きコピーとは?

基本的な仕組み
上書きコピーとは、同じ名前のファイルが既に存在する場所に新しいファイルをコピーして、古いファイルを置き換える操作のことです。
通常のコピー処理の流れ
- コピー元のファイルを読み込む
- コピー先に同名ファイルがあるかチェック
- 上書き処理の実行(または確認)
- 新しいファイルで置き換え
注意すべきポイント
データの損失リスク
- 上書きされた元のファイルは通常復元できない
- 重要なファイルは事前にバックアップが必要
- 権限の違いでコピーできない場合がある
意図しない上書きを避ける方法
- 確認オプションの使用
- テスト実行での事前確認
- 上書きしないオプションの活用
cpコマンドで上書きコピー
基本的な上書きコピー
Linuxのcp
コマンドはデフォルトで同名ファイルがあると上書きします。
単一ファイルのコピー
cp source.txt /destination/
複数ファイルのコピー
cp file1.txt file2.txt file3.txt /destination/
具体的な例
# 設定ファイルをバックアップフォルダにコピー
cp /etc/nginx/nginx.conf /backup/
# ログファイルを解析用ディレクトリにコピー
cp /var/log/access.log /tmp/analysis/
-i:上書き前に確認
安全な上書きコピー
cp -i source.txt /destination/
実行時の確認メッセージ
cp: overwrite '/destination/source.txt'? (y/n [n])
操作方法
- y または yes:上書きを実行
- n または no:上書きをスキップ
- Enter:デフォルト(通常はno)
実用例
# 重要な設定ファイルを慎重にコピー
cp -i /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# 複数ファイルを一つずつ確認してコピー
cp -i *.conf /backup/configs/
-r:ディレクトリの再帰的コピー
ディレクトリ全体をコピー
cp -r src_dir /destination/
よく使う組み合わせ
# ディレクトリを確認付きでコピー
cp -ri project_folder /backup/
# 隠しファイルも含めてコピー
cp -r source_dir/. /destination/
実用例
# Webサイトのファイルをバックアップ
cp -r /var/www/html /backup/website_$(date +%Y%m%d)
# ユーザーのホームディレクトリをコピー
cp -r /home/user /backup/users/
-n:上書きしない(新規のみ)
既存ファイルを保護
cp -n source.txt /destination/
この場合、同名ファイルがあればスキップして、新規ファイルのみコピーします。
実用例
# 設定ファイルのテンプレートを展開(既存は保護)
cp -n /etc/defaults/*.conf /etc/myapp/
# 新しいファイルのみを追加
cp -rn new_updates/* /production/
-u:更新されたファイルのみコピー
タイムスタンプを比較して新しいもののみコピー
cp -u source.txt /destination/
ディレクトリに適用
cp -ru src_dir/* /destination/
-b:バックアップを作成
上書き前に元ファイルのバックアップを作成
cp -b source.txt /destination/
元のファイルはfilename~
という名前で保存されます。
rsyncを使って上書きコピー

rsyncの特徴と利点
rsync
は同期に特化したコマンドで、cp
より効率的なコピーができます。
rsyncの利点
- 差分転送:変更部分のみを転送
- 断片的転送:大きなファイルを分割して転送
- ネットワーク対応:リモートサーバーとの同期
- 詳細なログ:何がコピーされたか詳しく表示
- 豊富なオプション:柔軟な制御が可能
基本的な上書きコピー(同期)
基本構文
rsync -av src_dir/ /destination/
オプションの説明
- -a:アーカイブモード(パーミッション、タイムスタンプ、シンボリックリンクを保持)
- -v:詳細表示(何がコピーされたかを表示)
実用例
# プロジェクトフォルダを同期
rsync -av /home/user/project/ /backup/project/
# Webサイトファイルを本番環境に同期
rsync -av /var/www/staging/ /var/www/production/
詳細な進行状況を確認
転送状況の詳細表示
rsync -av --progress src_dir/ /destination/
出力例
sending incremental file list
created directory /destination
./
file1.txt
1,024 100% 0.00kB/s 0:00:01 (xfr#1, to-chk=2/4)
file2.txt
2,048 100% 1.95MB/s 0:00:00 (xfr#2, to-chk=1/4)
上書き予定ファイルの確認
変更内容を事前確認
rsync -avi src_dir/ /destination/
-i オプションの出力記号
- >f:ファイルが転送される
- >d:ディレクトリが作成される
- .f:ファイルは最新(転送不要)
- cd:新しいディレクトリ
ドライラン(実際には実行しない)
rsync -avn src_dir/ /destination/
-n
オプションで実際にはコピーせず、何が実行されるかだけを確認できます。
特定のファイルを除外
不要なファイルを除外してコピー
# ログファイルとキャッシュを除外
rsync -av --exclude="*.log" --exclude="cache/" src_dir/ /destination/
# 複数の条件を指定
rsync -av --exclude="*.tmp" --exclude="*.bak" --exclude=".git/" project/ /backup/
除外ファイルリストを使用
# .rsyncignore ファイルを作成
echo "*.log" > .rsyncignore
echo "*.tmp" >> .rsyncignore
echo ".git/" >> .rsyncignore
# 除外リストを適用
rsync -av --exclude-from=.rsyncignore src_dir/ /destination/
上書きを避ける方法
cpで上書きを避ける
既存ファイルを保護
# 新規ファイルのみコピー
cp -n source.txt /destination/
# 確認してからコピー
cp -i source.txt /destination/
# より新しいファイルのみコピー
cp -u source.txt /destination/
rsyncで上書きを避ける
既存ファイルを無視
rsync -av --ignore-existing src_dir/ /destination/
バックアップを作成して上書き
rsync -av --backup --backup-dir=/backup/old src_dir/ /destination/
特定の条件のファイルのみ同期
# より新しいファイルのみ
rsync -av --update src_dir/ /destination/
# サイズが異なるファイルのみ
rsync -av --ignore-times src_dir/ /destination/
実用的な活用例

Webサイトのデプロイ
開発環境から本番環境への安全なデプロイ
# 事前確認
rsync -avn --exclude=".git/" --exclude="*.log" /var/www/staging/ /var/www/production/
# 実際のデプロイ
rsync -av --exclude=".git/" --exclude="*.log" /var/www/staging/ /var/www/production/
設定ファイルの管理
設定ファイルの安全な更新
# バックアップを作成してから更新
cp -b /etc/nginx/nginx.conf.new /etc/nginx/nginx.conf
# 確認付きで設定ファイルを展開
cp -i /etc/defaults/myapp.conf /etc/myapp/
データのバックアップ
定期バックアップスクリプト
#!/bin/bash
# 日次バックアップスクリプト
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/daily/$DATE"
# バックアップディレクトリを作成
mkdir -p "$BACKUP_DIR"
# 重要なディレクトリを同期
rsync -av /home/users/ "$BACKUP_DIR/users/"
rsync -av /etc/ "$BACKUP_DIR/etc/"
rsync -av /var/www/ "$BACKUP_DIR/www/"
echo "バックアップ完了: $BACKUP_DIR"
大量ファイルの効率的な同期
ネットワーク経由での同期
# リモートサーバーから同期
rsync -avz user@remote-server:/data/ /local/backup/
# SSH経由での同期
rsync -avz -e ssh /local/data/ user@backup-server:/backup/
パフォーマンスの最適化
高速化のテクニック
並列処理でのコピー
# 複数のrsyncを並列実行
rsync -av dir1/ /destination/dir1/ &
rsync -av dir2/ /destination/dir2/ &
rsync -av dir3/ /destination/dir3/ &
wait # 全てのプロセスの完了を待つ
圧縮を使用したネットワーク転送
rsync -avz src_dir/ user@remote:/destination/
メモリ使用量の調整
大量のファイルを扱う場合
# バッファサイズを調整
rsync -av --max-size=100M src_dir/ /destination/
# 一度に処理するファイル数を制限
find src_dir -type f -name "*.txt" | head -1000 | xargs -I {} cp {} /destination/
トラブルシューティング

よくある問題と対処法
Q:「Permission denied」エラーが出る
A:権限を確認してsudoを使用してください
# 権限を確認
ls -la /destination/
# sudo権限でコピー
sudo cp -r src_dir /destination/
# 所有者を変更
sudo chown -R user:group /destination/
Q:「No space left on device」エラー
A:ディスク容量を確認してください
# 容量確認
df -h /destination
# 事前にサイズを確認
du -sh src_dir
Q:シンボリックリンクがコピーされない
A:適切なオプションを使用してください
# シンボリックリンクをそのままコピー
cp -d source_link /destination/
# rsyncでシンボリックリンクを保持
rsync -avl src_dir/ /destination/
Q:隠しファイルがコピーされない
A:正しいパス指定を使用してください
# 隠しファイルも含めてコピー
cp -r src_dir/. /destination/
# rsyncで隠しファイルも含める
rsync -av src_dir/ /destination/
よくある質問

Q:cpとrsyncはどちらを使うべきですか?
A:用途によって使い分けてください
- 単純なコピー:cp
- 同期や差分転送:rsync
- ネットワーク転送:rsync
- 詳細なログが必要:rsync
Q:上書きコピーを取り消すことはできますか?
A:基本的には困難ですが、以下の予防策があります
- 事前のバックアップ作成
- バックアップオプション(-b)の使用
- バージョン管理システムの活用
Q:大量のファイルをコピーする際の注意点は?
A:以下に注意してください
- ディスク容量の確認
- I/O負荷の考慮
- ネットワーク帯域の制限
- 進行状況の監視
まとめ:安全で効率的な上書きコピーをマスターしよう
この記事のポイント
操作 | cp コマンド | rsync コマンド |
---|---|---|
基本的な上書きコピー | cp source.txt /dest/ | rsync -av src/ /dest/ |
上書き前の確認 | cp -i source.txt /dest/ | rsync -avi src/ /dest/ |
ディレクトリの上書きコピー | cp -r src_dir /dest/ | rsync -av src_dir/ /dest/ |
上書きを避ける | cp -n source.txt /dest/ | rsync -av --ignore-existing src/ /dest/ |
新しいファイルのみ | cp -u source.txt /dest/ | rsync -av --update src/ /dest/ |
選択の基準
- シンプルなコピー:cp を使用
- 効率的な同期:rsync を使用
- ネットワーク越し:rsync を使用
- 詳細な制御が必要:rsync を使用
安全なコピーのための心得
- 重要なファイルは事前にバックアップ
- -i オプションで確認しながら実行
- ドライラン(-n)で事前確認
- 進行状況を監視しながら実行
効率化のコツ
- rsyncで差分のみ転送
- 除外パターンで不要ファイルをスキップ
- 並列処理で高速化
- 適切なオプションの組み合わせ
これらの方法を覚えておけば、バックアップの更新、設定ファイルの配布、プロジェクトの同期など、さまざまな場面で安全かつ効率的にファイルコピーができるようになります。
コメント