rmコマンド 使い方:安全なファイル削除とリカバリー対策

概要

rmコマンドはファイルおよびディレクトリを削除するLinux/Unix標準コマンドです。

現場での重要性:削除は即座に実行され、一般的な環境ではゴミ箱のような復元機能は存在しません。このコマンドの誤用は本番環境でのデータ損失に直結するため、正確な構文理解と慎重な運用が必須です。逆に、適切に使いこなせば、ログローテーション、古いバックアップの削除、ビルド成果物のクリーンアップなど、日常的な運用タスクを効率化できます。

基本コマンド・構文

ファイルの削除

rm filename.txt

実行結果:

$ rm filename.txt
# 正常に削除された場合、標準出力には何も表示されない
# ファイルが存在しない場合のみエラーが出力される
rm: cannot remove 'filename.txt': No such file or directory

複数ファイルの削除

rm file1.txt file2.txt file3.log

ディレクトリの削除

rm -r directory_name

実行結果:

$ rm -r directory_name
# -rオプションにより、ディレクトリとその中身すべてが削除される
# 正常終了時は出力なし

3. 現場で必須のオプション・設定

-f (force) – 強制削除

rm -f file.txt

実務での必要性:
存在しないファイルを削除しようとした際のエラーを抑止します。シェルスクリプト内でファイル削除を行う場合、存在チェックなしでrm -fを使うことで、スクリプトの異常終了を防げます。Jenkinsやcronによる自動化処理では標準的な使い方です。

-r または -R (recursive) – 再帰的削除

rm -r /path/to/directory

実務での必要性:
ディレクトリ配下のすべてのファイル・サブディレクトリを削除します。ビルド成果物ディレクトリ(build/, dist/)やテンポラリディレクトリの一括削除に必須です。-rなしではディレクトリ削除はできません。

-i (interactive) – 対話的削除

rm -i *.log

実行結果:

$ rm -i *.log
rm: remove regular file 'app.log'? y
rm: remove regular file 'error.log'? y
rm: remove regular file 'access.log'? n

実務での必要性:
ワイルドカードを使った削除の前に、各ファイルの確認プロンプトが表示されます。本番環境で重要なファイルが混在している場合や、削除対象の最終確認が必要な場合に使用します。安全性は高まりますが、大量ファイル処理には不向きです。

-v (verbose) – 詳細表示

rm -v file1.txt file2.txt

実行結果:

$ rm -v file1.txt file2.txt
removed 'file1.txt'
removed 'file2.txt'

実務での必要性:
削除されたファイル名を逐次出力します。スクリプトのデバッグやログ記録、削除処理の監査証跡が必要な場合に有効です。運用手順書ではrm -vでの実行を標準としているケースも多くあります。

--preserve-root – ルートディレクトリ保護

rm -rf --preserve-root /

実務での必要性:
/(ルートディレクトリ)の削除を防ぎます。多くのディストリビューションでデフォルト有効ですが、古いシステムや--no-preserve-rootで無効化されている環境では明示的な指定が保険になります。

4. 実践的なユースケース(逆引きレシピ)

7日以上前のログファイルを削除

find /var/log/myapp -name "*.log" -mtime +7 -exec rm -f {} \;

解説:
findコマンドと組み合わせ、変更日が7日より古いログファイルを自動削除します。ログローテーション後の古いファイル削除に使用します。crontabに登録して定期実行するのが一般的です。

特定の拡張子以外をすべて削除

find /path/to/dir -type f ! -name "*.conf" -delete

解説:
.confファイル以外をすべて削除します。-deletefindの組み込みオプションで、-exec rmより安全かつ高速です。

空のディレクトリのみ削除

find /path/to/parent -type d -empty -delete

解説:
空ディレクトリのみを削除します。ビルドやテスト後の不要なディレクトリ構造のクリーンアップに使用します。

確認付きでディレクトリごと削除

rm -rI /path/to/directory

実行結果:

$ rm -rI /path/to/directory
rm: remove 3 arguments recursively? y

解説:
-Iオプション(大文字のアイ)は、3ファイル以上削除する場合や再帰削除時のみ1度だけ確認します。-iと異なり、大量ファイルでも実用的です。

ワイルドカードで安全に削除

# まず対象ファイルを確認
ls -l *.tmp

# 問題なければ削除
rm -f *.tmp

解説:
削除前にlsで対象を確認する癖をつけることで、想定外のファイル削除を防げます。特にワイルドカード使用時は必須の手順です。

5. シニアエンジニアの知恵(Expert Advice)

絶対にやってはいけないこと

# 危険: 変数が空の場合、/が削除される
rm -rf $DIR/

# 安全: 変数チェックを必ず行う
if [ -n "$DIR" ] && [ -d "$DIR" ]; then
  rm -rf "$DIR"
fi

変数展開の罠:
シェル変数を使った削除では、変数が未定義や空文字の場合、rm -rf /が実行されるリスクがあります。必ず変数の存在チェックと、可能であればフルパス指定を行ってください。

エイリアス設定による事故防止

# ~/.bashrcや~/.zshrcに追加
alias rm='rm -i'

本番環境では推奨しませんが、開発環境ではrmを常に対話モードにすることで、うっかりミスを減らせます。ただし、スクリプト内では/bin/rmを直接呼び出すか、\rmでエイリアスを回避する必要があります。

削除の代わりに移動を検討

# 削除ではなく、一時領域に移動
TRASH_DIR="/tmp/trash_$(date +%Y%m%d)"
mkdir -p "$TRASH_DIR"
mv /path/to/file "$TRASH_DIR/"

重要なファイルを扱う場合、rmの代わりに専用のゴミ箱ディレクトリへmvすることで、一定期間の復元猶予を設けられます。運用チームでは標準手順化されているケースもあります。

パーミッションと所有者の確認

ls -ld /path/to/directory

削除前に対象ディレクトリの権限と所有者を確認することで、意図しないシステムディレクトリの削除を防げます。特にroot権限での作業時は必須です。

セーフティネットとしてのreadonly化

# 誤削除防止のため、一時的に読み取り専用に
chmod -R a-w /critical/data

# 作業完了後に元に戻す
chmod -R u+w /critical/data

重要なデータディレクトリは、メンテナンス時以外は書き込み権限を外しておくことで、rmコマンドによる誤削除を物理的に防げます。