「誤って上書きしてしまった…」を防ぎつつ、フォルダごと素早くバックアップしたい人向けの実践ガイドです。
cp -i(interactive)は上書きの前に確認を求めてくれるので、安全第一の手動バックアップに最適。LinuxとmacOSで使える基本〜応用までを一気にまとめます。
この記事でできること(コピペ可・最短ルート)
- 権限ごと安全にバックアップ(上書き確認あり)
cp -ai /path/to/SRC_DIR /path/to/DEST_PARENT/
- 隠しファイルも含めて中身だけをコピー(上書き確認あり)
cp -ai /path/to/SRC_DIR/. /path/to/DEST_DIR/
- 外付けHDDに日付付きで履歴バックアップ(上書き確認あり)
STAMP=$(date +%F)
cp -ai /path/to/SRC_DIR "/Volumes/Backup/$STAMP-SRC_DIR"
cp -i とは?(まずは要点だけ)
-iは 上書きの直前に確認プロンプト を出します(interactive)。- 「安全>速度」のときに有効。急ぎでない手動バックアップに最適。
-r(再帰)や-a(アーカイブ)と組み合わせて使うのが定番です。
おすすめ組み合わせ:
cp -ai
メタデータ(権限・タイムスタンプ・シンボリックリンクなど)を極力保持しつつ、上書き前に確認できます。
基本:フォルダを丸ごとコピーする
親ディレクトリへ「そのまま」持っていく
cp -ai /path/to/SRC_DIR /path/to/DEST_PARENT/
# → /path/to/DEST_PARENT/SRC_DIR として作成(既存なら上書き前に確認)
既存ディレクトリへ「中身だけ」入れたいとき
cp -ai /path/to/SRC_DIR/. /path/to/DEST_DIR/
# 「.」を使うと SRC_DIR の“中身”を DEST_DIR に展開
隠しファイル(.git など)も含めたいとき
SRC_DIR を丸ごとコピーする形(SRC_DIRやSRC_DIR/.)なら 隠しファイルも含まれます。
ワイルドカード(*)で中身を選ぶと隠しファイルが漏れるので注意。
上書き確認の対話例(何が起きるか見ておく)
cp -ai src/. dest/
cp: overwrite 'dest/config.yaml'? y
'./config.yaml' -> 'dest/config.yaml'
cp: overwrite 'dest/logo.png'? n
cp: not overwriting 'dest/logo.png'
yで上書き、nでスキップ。- まとめて自動化したい場合は
-iではなく-n(no-clobber:上書きしない) を使います(後述)。
ケース別のコツと落とし穴
1) 目的地(DEST)が存在する / しない
- 存在する(かつフォルダ)→
DEST/SRC_DIRを作る or 中身を入れる(使い分けはSRC_DIRvsSRC_DIR/.) - 存在しない →
DESTという新しいフォルダ名でコピーを作成
2) 末尾スラッシュ(/)の意味
cpはrsyncほど末尾スラッシュの意味がシビアではありませんが、
「中身だけ」ならSRC_DIR/.と明示するのが確実です。
3) 権限・時刻を保ちたい
-a(アーカイブ)を使いましょう。-RpP相当(環境により実装差あり)で、メタデータを極力維持します。
4) シンボリックリンクの扱い
-aはリンクをリンクのままコピー(推奨)- リンク先の実体をコピーしたいなら
-Lを併用
5) 大量ファイル & ネットワーク越し
cpはシンプルで速いですが、差分や除外が必要ならrsyncを検討(下記参照)。
よく使うオプション(安全強化に効く)
| オプション | 目的・効果 | 例 |
|---|---|---|
-i | 上書き前に確認(安全) | cp -ai SRC DEST/ |
-n | 上書きしない(無言でスキップ) | cp -an SRC/. DEST/ |
-u | 変更が新しいものだけ上書き | cp -au SRC/. DEST/ |
-v | 進捗を表示 | cp -aiv SRC DEST/ |
-p | タイムスタンプ等を保持 | cp -ipR SRC DEST/ |
-a | アーカイブ(ほぼ全部維持) | cp -ai SRC DEST/ |
--backup / -b | 上書き時にバックアップファイル作成(GNU系) | cp -aiv --backup=numbered SRC/. DEST/ |
互換性メモ
GNU(多くのLinux)とBSD系(macOS)で対応オプションが異なることがあります。
例:--backup=numberedは GNU限定。macOS では代わりに-iや-nを使う、もしくはrsyncへ切替。
外付けHDD/USBに安全バックアップ
1) 丸ごとコピー(権限保持・上書き確認)
cp -ai /project/data "/Volumes/BackupDisk/"
# → /Volumes/BackupDisk/data を作成
2) 日付付き履歴を残す
STAMP=$(date +%F) # 例: 2025-08-23
cp -ai /project/data "/Volumes/BackupDisk/${STAMP}-data"
3) 古い履歴を30日でローテーション(任意)
find "/Volumes/BackupDisk" -maxdepth 1 -type d -name "20??-??-??-data" -mtime +30 -exec rm -rf {} +
安全ポイント
消去系コマンドは最初に-exec echo rm -rf {} +として“表示だけ”試すのが鉄則。
スクリプト化テンプレ(安全ガード付き)
#!/usr/bin/env bash
set -euo pipefail
SRC="/path/to/SRC_DIR"
DEST_PARENT="/path/to/DEST_PARENT"
STAMP=$(date +%F)
DEST="${DEST_PARENT}/${STAMP}-$(basename "$SRC")"
[[ -d "$SRC" ]] || { echo "SRC not found: $SRC" >&2; exit 1; }
mkdir -p "$DEST_PARENT"
echo "Copying '$SRC' -> '$DEST'"
cp -ai "$SRC" "$DEST_PARENT"/
echo "Done: $DEST"
-iなので途中で上書き確認が止まる点に注意(夜間バッチには不向き)。
無人実行は-n(上書き回避)や日付で新規作成にしましょう。
トラブル時のチェックリスト
- 隠しファイルがコピーされない
→SRC_DIR/.で中身コピー、またはフォルダごとコピー(SRC_DIR)を使う。*展開は避ける。 - Permission denied
→ 読み取り権限があるか、sudo必要かを確認。対象FSのマウントオプションも要確認。 - 無人で止まる(プロンプト待ち)
→-iをやめて-nに変更、または毎回新しい履歴ディレクトリを作成。 - シンボリックリンクでループ
→-aか-Pを使う(リンクはリンクのまま)。実体が要るなら-L。 - 属性が失われる
→-aを利用。別FS(FAT/exFAT等)では保持できない属性がある点に注意。
いつ rsync を使うべき?
- 差分コピー・除外パターン・進捗・ネットワーク越しなど、運用が重くなるほど
rsyncの出番です。 rsyncで「上書き回避」に近い挙動は--ignore-existing。
rsync -av --ignore-existing /path/to/SRC_DIR/. /path/to/DEST_DIR/
まとめ
- 手動で安全にバックアップするなら
cp -iがシンプルで強力。 - 権限や時刻も保持したいなら
cp -aiが定番。 - 無人実行・差分・除外が必要になったら
-nやrsyncを検討。 - 事故を防ぐコツは「
SRC_DIR/.で中身指定」「履歴は日付で新規作成」「削除はまずドライラン」。
上書き確認の一手間が、取り返しのつかない事故を確実に減らします。まずは今日の大事なフォルダから、cp -ai で“安全第一のバックアップ”を。

コメント