Hatena::ブログ(Diary)

かーねる・う゛いえむにっき このページをアンテナに追加 RSSフィード Twitter

2013-01-22

[]シンボリックリンク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にはそういう設定があらかじめ入っている事が多いので、うっかりさえしなければ心配しなくていいかもしれない。

fumiyasfumiyas 2013/01/22 14:40 zsh なら「うっかりタブ補完連打するとそうなるけども」はある程度防げます。
例えば「rm -rf t<tab>」→「rm -rf tmp/」となりますが、ここで Enter 押すと
最後の「/」が消えて「rm -rf tmp」が実行されます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証