Linux / コマンド / rm - ファイルとディレクトリの削除

rmは、ファイルやディレクトリをファイルシステムから削除するコマンドです。一般的なデスクトップのごみ箱を経由せず、特に-rと-fを併用すると大量のデータを確認なしで削除できるため、対象パスの確認が最も重要です。

この記事では、基本的な削除、空ディレクトリと再帰削除、確認オプション、シェルグロブと変数使用時の危険、及び自動化で削除範囲を制限する方法について説明します。

rmコマンドとは?

rmは指定したディレクトリエントリを削除します。ファイルのリンク数が0になり、どのプロセスも開いていない場合、ストレージ領域は後で再利用可能になります。基本的にディレクトリは削除されず、ディレクトリツリーを削除するには再帰オプションを指定する必要があります。

基本的な文法

rm [オプション] ファイル ...

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、rm --helpとman rmで現在のシステムの説明を確認してください。

rmの基本的な使い方

ファイルを1つ削除する

削除する正確なパスを指定します。ハイフンで始まるファイル名は--の後に置きます。

rm old-report.txt
rm -- -temporary.txt

複数ファイルを削除する

複数のパスやシェルグロブを使用できますが、実行前に展開結果を確認するのが安全です。

printf '%s\n' *.tmp
rm -- *.tmp

ディレクトリツリーを削除する

-rはサブ内容を再帰的に削除します。まず find や ls で対象を確認し、できるだけ具体的なパスを使用してください。以下は自分で作った削除専用の練習用ディレクトリだけを対象にします。表示を -maxdepth 2 に制限しても、削除はそれより深い階層まで及びます。

find build-cache -maxdepth 2 -print
rm -r -- build-cache

削除コマンドが静かに終了した時

rmは成功しても通常何も出力しません。次は自作の説明用ファイルにのみ適用する安全な確認例です。

printf 'demo\n' > disposable-demo.txt
rm -- disposable-demo.txt
test ! -e disposable-demo.txt
echo $?

例の出力 0は該当パスがもはや存在しないことを意味します。ファイルを復元できる保証はなく、rm -rやrm -fを実際のパスに使用する前に、削除対象をリストで確認してください。

主なオプション

オプション 説明
-r, -R ディレクトリとサブ内容を再帰的に削除します。
-i すべて削除する前に個別確認を求めます。
-I 指定したファイルが3個を超える場合、または再帰削除を指定した場合に、操作全体について一度確認します。
-f, --force 存在しないファイルを無視して確認を省略します。権限エラーまで無視して成功する指定ではありません。
-d, --dir 空のディレクトリを削除できるようにします。
-v 削除処理の対象名を表示します。失敗時は診断も確認してください。
--one-file-system 再帰的削除中に他のファイルシステムに降りません。
--preserve-root[=all] 既定ではルート / の再帰削除を拒否します。=all では、親ディレクトリと異なるファイルシステムにあるコマンド引数も拒否します。任意の重要フォルダーを保護する指定ではありません。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

削除対象を事前に確認する

シェルが * を展開した結果と変数の実際の値を最初に出力します。改行や空白を含むファイル名を扱う場合は find -print0 と互換性のあるオプションを確認してください。

printf 'target=%s\n' "$target"
find "$target" -maxdepth 2 -print

対話型確認を使用する

いくつかの重要なファイルを直接削除する場合は-i、多くのファイルや再帰的作業で少なくとも一度は確認したい場合は-Iが便利です。自動化では対話型オプションの代わりに、事前条件をコードで確認する必要があります。

rm -i important.conf
rm -Ir old-release/

他のマウントポイントを保持する

バックアップやシステムツリー内に別のファイルシステムがマウントされていることがあります。再帰的削除がその境界を越えないようにする場合は--one-file-systemを確認し、まずマウント状態をチェックしてください。同じファイルシステム内のbind mountなどは、このオプションだけでは保護できません。例の /srv/chroot は破棄することを確認した専用のツリーを想定しており、通常のシステム領域へそのまま実行しないでください。

findmnt --target /srv/chroot
rm -r --one-file-system -- /srv/chroot

rmおよび関連コマンドの比較

コマンド・方法 主な役割 適した状況
rm ファイルおよび再帰ディレクトリの削除 正確に指定した項目をごみ箱を経由せず削除する場合
rmdir 空のディレクトリのみを削除 内容が残る場合に保存する必要があるとき
デスクトップごみ箱ツール 復元可能な場所に移動 対話型環境でミスを回復する必要があるとき
shred ファイルデータを上書きする試み サポート条件と限界を理解し、痕跡の削減が必要なとき

使用する際の注意点

rm -rf を習慣的に使用しない

-r は範囲を広げ、-f は警告を減らします。必要なオプションのみを使用し、変数で作成したパスが空でないか、予想されるルートの下にあるかを検証してください。

エイリアスだけを安全装置として頼らない

alias rm='rm -i'は非対話型シェルや他のシステムでは適用されない場合があります。スクリプトの安全性はエイリアスではなく、パス検証と権限分離に基づくべきです。

削除後の復元を前提としない

削除されたデータはファイルシステムやストレージの状態によって非常に復元が困難または不可能です。重要なデータは削除前に別の検証済みバックアップが必要です。

FAQ

rmで削除するとゴミ箱に入りますか?

一般的に入りません。コマンドラインのrmはデスクトップのゴミ箱を経由しないため、すぐに復元できると考えてはいけません。

ディレクトリを削除するにはどのオプションが必要ですか?

内容のあるディレクトリには-rが必要です。空のディレクトリであればrmdirコマンドで削除対象を制限できます。

rm -iとrm -Iの違いは何ですか?

-iは項目ごとに尋ね、-I は指定したファイルが3個を超える場合、または再帰削除の場合に、操作全体について一度確認します。少数ファイルの通常削除では確認されない点に注意してください。

誤って削除したファイルをすぐに復元できますか?

保証できません。すぐに書き込み操作を減らし、ファイルシステムとバックアップポリシーに応じた復元手順を確認する必要があります。

参考資料