ファイルのコピー(cp)・移動と改名(mv)・削除(rm)は、Linuxでもっとも頻繁に使う3コマンドです。書き方はシンプルですが、Windowsのエクスプローラーとは違う「怖い仕様」がいくつかあります。代表が、上書きもコピーも削除も、確認なしで即実行されることです。ゴミ箱もありません。
この記事では、実機のLinux(WSLのDebian)で「上書きでデータが消える瞬間」まで実際に再現しながら、cp・mv・rmの基本と安全な使い方を整理します。ディレクトリに-rが必要な理由や、rm -rfがなぜ危険なのかも、実例で確認します。
- コピーは
cp 元 先、移動・改名はmv 元 先、削除はrm ファイルです。 - ディレクトリのコピー・削除には
-rが必要です(cp -r / rm -r)。 - cpもmvも、上書きは確認なしで実行されます。既存の中身は黙って消えます。
- 確認を出すには
-iを付けます(cp -i・mv -i・rm -i)。 rmにゴミ箱はありません。rm -rfは特に慎重に。- タイムスタンプ等を保ってコピーするには
cp -pを使います。
削除前の中身確認はlsなど基本コマンド、条件を絞った一括削除はfindコマンド(-delete)、コピーでリンクがどう扱われるかはシンボリックリンクもあわせて参考になります。
cpの基本とディレクトリの-r
コピーはcp 元 先です。ただしディレクトリをコピーするには-r(再帰)が必須で、付けないとエラーになります。
# ファイルのコピー cp a.txt b.txt # a.txt を b.txt という名前でコピー cp a.txt backup/ # backup ディレクトリの中へコピー # ディレクトリはそのままではコピーできない cp dir dir2 # cp: -r not specified; omitting directory 'dir' # -r を付けると中身ごとコピーされる cp -r dir dir2
実機でも、ディレクトリを-rなしでコピーしようとするとcp: -r not specified; omitting directoryというエラーになり、cp -rを付けると中身のファイルごと正しくコピーされました。-rは「中のファイル・サブディレクトリを再帰的にたどる」という意味で、「ディレクトリを扱うときは-r」はcpとrmに共通するルールです。コピー先にディレクトリを指定すれば(backup/)、その中へ同名でコピーされます。
【最重要】上書きは確認なし
Linuxのcpとmvで必ず知っておくべきなのがこれです。コピー先・移動先に同名ファイルがあっても、確認なしで上書きされます。「上書きしますか?」とは聞いてくれません。
echo "大事なデータ" > b.txt echo "新しい内容" > c.txt # 確認なしで b.txt が上書きされる! cp c.txt b.txt cat b.txt # 新しい内容 ←「大事なデータ」は消えた # mv も同じ(y.txt の中身は黙って消える) mv x.txt y.txt # -i を付けると確認してくれる cp -i c.txt b.txt # cp: overwrite 'b.txt'? ← n と答えれば保護される
実機で確認したところ、v1と書かれたb.txtがある状態でcp c.txt b.txtを実行すると、何の警告もなくb.txtの中身が置き換わり、元のデータは消えました。mv x.txt y.txtでも同様に、移動先y.txtの中身が黙って失われました。ゴミ箱は無いため、上書きされた内容は元に戻せません。防ぐには-i(interactive)を付けます。実機でも、cp -iはoverwrite 'b.txt'?と確認を出し、nと答えるとファイルが保護されました。うっかりが怖い人は、シェルの設定でalias cp='cp -i'のように別名を仕込んでおく方法もあります。重要なファイルを扱う前には、コピー先に同名が無いかlsで見る癖をつけると安全です。
mvは「移動」と「改名」の二役
mvは移動(move)と名前の変更(rename)の両方を担います。Linuxには専用のrenameコマンドを使わなくても、mvだけでファイル名を変えられます。
# 改名(同じ場所で名前だけ変える) mv a.txt renamed.txt # 移動(別のディレクトリへ) mv renamed.txt dir/ # 移動しながら改名 mv old.txt dir/new.txt # ディレクトリの移動・改名も -r 不要でそのまま mv dir newdir
実機でも、mv a.txt renamed.txtで改名でき、mv renamed.txt dir/でディレクトリの中へ移動できました。先がファイル名なら改名、既存ディレクトリなら移動、と覚えると分かりやすいです。なおmvはcpと違い、ディレクトリでも-rは不要です(実体の場所を付け替えるだけで、中身をたどる必要がないため)。
rmの基本と-r・ゴミ箱は無い
削除はrm ファイルです。ただしディレクトリには効かず、rm -rが必要です。そして繰り返しになりますが、Linuxのrmにゴミ箱はありません。
# ファイルの削除(即座に消える・ゴミ箱なし) rm memo.txt # ディレクトリはそのままでは消せない rm dir2 # rm: cannot remove 'dir2': Is a directory # -r で中身ごと削除 rm -r dir2 # -i で1つずつ確認しながら削除 rm -i *.txt
実機でも、ディレクトリへのrmはrm: cannot remove 'dir2': Is a directoryとなり、rm -r dir2で中身ごと削除できました(削除後はNo such file or directory)。-rの意味はcpと同じ「再帰」です。削除に不安があるときは-iで1件ずつ確認するか、findで対象を先に一覧してから消すと安全です。
rm -rf の危険性
rm -rに-f(force)を足したrm -rfは、「確認も警告も一切なしで、ディレクトリごと全部消す」コマンドです。便利ですが、Linuxでもっとも事故の多いコマンドでもあります。
# -f は「確認を出さない・エラーも黙殺」 rm -rf old_project/ # 【危険な事故パターン】 # 変数が空だと「rm -rf /」相当になり得る # rm -rf $DIR/ ← $DIR が未定義なら / を消しに行く # 安全策1: 消す前に対象を ls で確認 ls old_project/ # 安全策2: 変数は必ずクォート+存在確認 [ -n "$DIR" ] && rm -rf "$DIR"
-fは-iの逆で、確認プロンプトを一切出さず、存在しないファイルのエラーも黙殺します。rm -rf ディレクトリは一瞬で配下のすべてを消し、ゴミ箱もアンドゥもありません。とくに危険なのが変数と組み合わせたときで、rm -rf $DIR/の$DIRが空だとrm -rf /に相当する挙動になりかねません(多くの環境では--no-preserve-rootなしの/直接指定は保護されますが、$DIR/*のような形は保護されません)。実行前に①lsで消す対象を目視、②パスをタブ補完で入力(タイプミス防止)、③スクリプト内では変数の存在チェック——この3つを習慣にしてください。当サイトのfindのように「先に検索だけして確認→削除」の二段構えも有効です。
タイムスタンプを保つ cp -p
普通にcpすると、コピー先の更新日時は「コピーした瞬間」に変わります。元のタイムスタンプや権限を保ちたいバックアップ用途では-p(preserve)を付けます。
# 2020年のタイムスタンプを持つファイルをコピーすると… cp old.txt normal.txt # 更新日時はコピーした今日になる cp -p old.txt keep.txt # -p なら元の日時を保持 ls -l normal.txt keep.txt # normal.txt … 今日の日付 # keep.txt … 2020-01-01(元のまま)
実機でも、2020年のタイムスタンプを持つファイルを通常のcpでコピーすると更新日時が今日(2026年)に変わり、cp -pでは2020年のまま保持されました。-pはタイムスタンプのほか、権限や所有者(可能な範囲)も保ちます。更新日で古いファイルを整理する運用をしている場合、通常のcpでバックアップすると日時がリセットされて判定が狂うため、バックアップ系のコピーは-p(またはより完全な-a)が定番です。
主な書き方一覧
3コマンドの要点をまとめます。
| 書き方 | 働き |
|---|---|
cp 元 先 / cp -r ディレクトリ 先 |
コピー(ディレクトリは-r必須) |
cp -p / cp -a |
日時・権限を保持してコピー |
mv 元 先 |
移動・改名(-r不要) |
rm ファイル / rm -r ディレクトリ |
削除(ゴミ箱なし) |
-i(cp/mv/rm共通) |
上書き・削除前に確認 |
rm -rf |
強制全削除(最重要注意) |
よくある失敗
上書きで大事なファイルを失う
cp・mvは確認なしで上書きします。-iを付けるか、先にlsで同名の有無を確認します。
ディレクトリのcp/rmで-rを忘れる
omitting directory/Is a directoryエラーになります。-rを付けます(mvは不要)。
rm -rfの対象をタイプミスする
一瞬で全消去され戻せません。タブ補完で入力し、実行前にlsで確認します。
変数入りのrm -rfで事故る
$DIRが空だと壊滅的です。[ -n "$DIR" ]の存在確認とクォートを徹底します。
バックアップでタイムスタンプが変わる
通常のcpは日時がリセットされます。保持したいなら-pや-aを使います。
よくある質問
cp -r 元ディレクトリ 先と、-r(再帰)を付けます。付けないとomitting directoryというエラーでスキップされます。中のファイル・サブディレクトリごとコピーされます。日時や権限も保ちたい場合はcp -aが便利です。-iを付けてください(cp -i・mv -i)。overwrite?と聞かれ、nで保護できます。mvを使います。mv 古い名前 新しい名前で改名できます。mvは「移動」と「改名」の二役で、移動先が既存のディレクトリなら移動、新しいファイル名なら改名になります。ディレクトリの改名も同じ書き方です。rmにゴミ箱はなく、削除は即時かつ不可逆です。重要な削除の前にはlsで対象を確認し、不安ならrm -iで1件ずつ確認するか、削除ではなく退避用ディレクトリへのmvを検討してください。rm -rf $DIR/で$DIRが未定義など)による事故が後を絶ちません。実行前に対象をlsで目視し、パスはタブ補完で入力、スクリプトでは変数の存在チェックを行ってください。まとめ
- コピー
cp・移動/改名mv・削除rm。ディレクトリはcp/rmに-r(mvは不要)。 - 上書きは無警告。防ぐには
-i、実行前のls確認を習慣に。 rmにゴミ箱はなく不可逆。rm -rfはタブ補完+事前ls+変数チェックで。- バックアップ用途のコピーは
-p/-aで日時・権限を保持します。
cp・mv・rmは毎日使う分、事故も起きやすいコマンドです。「上書きも削除も黙って即実行される」というLinuxの流儀を体で覚え、-iと事前確認を味方につければ、安心して高速なファイル操作ができるようになります。
