Edited at
zshDay 16

zshではrmコマンドでファイルを削除する前に確認を求めてくれる

More than 3 years have passed since last update.


rm *で確認を求める

zshには、rm *とかワイルドカード指定でファイルを削除するときにyes/noで確認を求めてくる機能がある。というかその機能はデフォルトで有効になっているので、見たことある人も多いと思う。

この機能を使っている様子は以下の通り。

% rm hoge.txt

#<= 個別のファイルを指定して削除するときは特に何も起こらない

% rm *
zsh: sure you want to delete all the files in /home/mollifier/work [yn]?
#<= *で削除するときは、rmコマンドを実行する前にzshが確認を求めてくる

% rm -rf *
zsh: sure you want to delete all the files in /home/mollifier/work [yn]?
#<= rmにオプションを指定していても同様

rmコマンドは-iオプションを付けると削除してよいか聞いてくるけど、この機能を使うと-iとか-fとかrmのオプション指定によらずに、削除対象に*が入っているとrmコマンドを実行する前にzshが聞いてくる。これでrm * .txtのようにスペースを入れてしまったりとか、意図せず*で全ファイルを削除してしまうようなことを防げる。

逆にこの機能を使いたくない場合はRM_STAR_SILENTオプションを有効にする。

# rm *で確認を求める機能を無効化する

setopt RM_STAR_SILENT


勢いで間違ってyesを選んでしまうのを防ぐ

さっきの機能を有効にして使っていても、ずっと使ってるとそのうち「はいはい、yesね」みたいな感じで、何も考えずにyesを選んでしまうようになる(人によるけど)。そういうふうになってしまうと確認を求めてる意味がなくなる。zshはそういう人のことも心配して、RM_STAR_WAITというオプションも用意してくれている。

setopt RM_STAR_WAIT

これを有効にするとyes/noを聞く前に10秒待つようになる。なので、惰性で適当にyesを選ぶというのができなくなる。その10秒間に冷静になって、本当に問題ないか確認しようという機能。

% rm -rf *

zsh: sure you want to delete all the files in /home/mollifier/work? (waiting ten seconds)
#<= ここで10秒間操作を受け付けなくなる
[yn]?
#<= 10秒たつとyes/noを選べるようになる。

このオプションは最初に紹介した機能を有効にしてるときだけ意味がある。setopt RM_STAR_SILENTで無効にしてたらそもそもyes/noを聞いてこないので、RM_STAR_WAITを有効にしたとしても10秒待たない。


最後に

最後に注意として、この機能はいつでも有効というわけではなく、抜け道もある。

まず、コマンド名がrmでないときはこの機能は動作しない。/bin/rmとフルパスで指定した時も「コマンド名がrmでない」という状態にあたるので、yes/noを聞いてこない。

% /bin/rm -rf *

#<= yes/noを聞かない

あと、削除する対象が単独の*でなく、前後に何か付けているときも聞いてこない。

% rm -f *.txt

#<= yes/noを聞かない

なので、この機能を有効にしていたとしても、そもそもrmコマンドを実行するときはEnterを押す前に確認する、というのが大事だと思う。