シンボリックリンクを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する習慣があれば大丈夫。
このケースではどちらもされてなかったということ。
UbuntuやRedhatなどの主要ディストリの.bashrcにはそういう設定があらかじめ入っている事が多いので、うっかりさえしなければ心配しなくていいかもしれない。