本日の小ネタ。
文脈
よくインターネットでは特定のディレクトリを消そうとして、
rm -rf / # ここで補完をしようと思った
と言う大事故が起きたりしますが、これを比較的安全に運用する方法を紹介したいと思います。
やり方
これらの小ネタはNixOS上のzshとGNU coreutilsを前提としています。
1. コマンド引数を後置にする
$ rm target/ -rf
コツとしては rm コマンドの直後に削除したいディレクトリ名を指定し、
その後で -rf などの引数を付ける、というスタイルでコマンドを打つことです。
こうすると意図しないディレクトリの削除が起きにくく、比較的事故を防げます。
2. -f を使わない
# 空のディレクトリを消す場合 $ rm target -d # ディレクトリを再帰的に消す場合 $ rm target -r
rm -rf の内 -f オプションはファイルを強制的に消す時などで便利ですが、
他のプロセスが握っているファイルやディレクトリなども消せてしまうので、原則として使わないようにします。
特にシステムが握っている重要なファイルについては、-f オプション抜きだと Device or Resource busy で消せない事が多く、
-f オプションの指定はこれらを無視するため、システムの破損を防ぐ意味でも -f オプションは抜きましょう。
また空のディレクトリを消したい場合では -d オプションを用い、
再帰的にファイルを消したい場合では -r オプションだけを用いると比較的安全になります。
3. そもそも生の rm を使わない
これはユーザー権限での話になりますが、そもそも生の rm を使うから事故が起きるのであって、
rm の代わりにこれらのソフトウェアを使うと比較的事故が減らせるかもしれません:
andreafrancia/trash-cli: Command line interface to the freedesktop.org trashcan.
babarot/gomi: 🗑️ Your UNIX rm command with a safety net!
なおこれらのソフトウェアに対し、シェル環境で alias rm=trash とエイリアスを貼っていたとしても、
zshだと \rm と言う形で生の rm にアクセスできるので、そのような状態でシェルを運用すると良いかもしれません。
以上
と言う事で今回の小ネタは以上です。
私は2025年4月現在、この運用でうっかりシステムを粉砕する事故を防げていますが、皆さんのところではどんなもんでしょうか。
rm コマンドに関連してはバルスコマンドとして sudo rm -rf / というアレが良くネタになっていますが、
これについてはジョークでも実行してはなりません。
何故かと言うと、Linux distroによってはUEFI BIOSの変数が /sys/firmware/efi/efivars/ 以下で編集できるようになっており、
sudo rm -rf / はこれを全滅させ、Firmwareが壊れ最終的には修理行きとなるからです。
※ASUSのマザーボードのようにCPU無しでもUEFI Firmwareの書き込みをサポートしていれば復旧できそうですが、そうでなければそのまま死ぬと思います(たぶん)。
そういった意味でも sudo rm -rf は危険なので、可能な限り rm コマンドでは -f オプションを使わず、
sudo rm target -r と言った形でオプションを後置にすると良いと思います。