シンボリックリンクをrm -rf symlink/すると不幸になる

Twitterでちょっと話題にしたのでメモしとく。

sh-3.2$ mkdir -p hoge/huga
sh-3.2$ touch hoge/huga/piyo
sh-3.2$ ln -sf hoge tmp
sh-3.2$ rm -rfv tmp
tmp
sh-3.2$ ls -l hoge/huga/piyo
-rw-r--r--  1 syuu  staff  0  1 22 14:25 hoge/huga/piyo

シンボリックリンクをrm -rf tmpする分にはシンボリックリンクだけが消える。

sh-3.2$ ln -sf hoge tmp
sh-3.2$ rm -rfv tmp/
tmp//huga/piyo
tmp//huga
tmp/
sh-3.2$ ls -l hoge/huga/piyo
ls: hoge/huga/piyo: No such file or directory

シンボリックリンクをrm -rf tmp/するとhogeが参照されて向こう側のディレクトリの中身が消える。

意味が全然違うので気をつけたい、というか、シンボリックリンクだと気づかずにうっかりrm -rf tmp/して自爆した自分を殴りたい。
そもそもrm -rf対象の末尾に/を付ける必要はないので、そんな書き方するべきじゃない。うっかりタブ補完連打するとそうなるけども。


追記:
ちょっと紛らわしかったので追記しておくと、僕はlsで削除ターゲットを確認した時にシンボリックリンクだと思わずにディレクトリだと勘違いしたのね(それも見分けられるような確認の仕方を心がけるべき事例ですが)。
ディレクトリを削除するなら末尾に/が要らない。
更に、削除ターゲットがシンボリックリンクだったならそもそも-rfオプションが要らない。
ディレクトリだと誤解してたとしても、末尾に/を付けないことで失敗を防げるという話でした。


追記2:
見分けられるような確認の仕方、だけど、alias ls='ls -F'って.bashrcに(或いは他のシェルの設定ファイルに)設定されてさえいれば、lsで分かるし、設定されてなくてもls -Fする習慣があれば大丈夫。
このケースではどちらもされてなかったということ。
UbuntuRedhatなどの主要ディストリの.bashrcにはそういう設定があらかじめ入っている事が多いので、うっかりさえしなければ心配しなくていいかもしれない。