Edited at

rmでしくじらない方法


定期的にやらかすやつ

myuser@myhost:greatlib$ make

...
prog.cc:1:10: fatal error: missed_header: No such file or directory

僕「ダウンロードして解凍して手順通りmakeしてるだけなのに、コンパイルがうまくいかんなあ。includeとか見てみるか」

myuser@myhost:greatlib$ cd /usr/include

myuser@myhost:include$ ls
...

僕「ライブラリあるはずなのになあ、うまくいかんし、どうすればええんや、とりあえず戻っとこ」

myuser@myhost:include$ cd 

(ここでちょっと考え込む)

僕「もういっそやり直すか、とりあえず中間ファイル全部消しとこ」

myuser@myhost:~$ rm -rf *

僕「さて、ホームに戻って...あれ、なんか時間かかったな、やな予感がする」

myuser@myhost:~$ ls

myuser@myhost:~$

僕「...やらかした」


惨劇の原因

まず第一にワイルドカードで指定してしまったこと。特に*は任意の文字列を表すので、間違えたディレクトリで使うと必要なファイルも全部指定してしまいます。

第二に-rfというフラグ。rは再帰的にディレクトリも削除する、fは確認なしで削除するというフラグなので、rm -rfは指定されたファイルを血も涙もなく押し流します。

第三に状態がわからない状態で時間がかかるのを放置したこと。気づけば途中で止めれたかもしれません。後の祭りという感じがありますが...。


対策

とはいえ、「rm -rf *を使わない」と決めると非常に困ります。今回もそうですが大量のファイルを消すときに-fオプションを使わないと、yを100回以上押さないといけなくなることもあります。

-rを使わないと

rm: cannot remove 'hoge': Is a directory

と表示されて「あ"!?ディレクトリやからなんやねん!?」となります。


-vフラグも立てる

根本解決にはなりませんが、ミスってやばいことになると滝のような通知が表示されるので、運がよければ重要なファイルが消える前にCtrl+cで止めることができます。

myuser@myhost:~$ rm -vrf *

removed directory 'hoge'
removed 'hoge1.txt'
removed 'hoge10.txt'
removed 'hoge100.txt'
removed 'hoge11.txt'
removed 'hoge12.txt'
removed 'hoge13.txt'
removed 'hoge14.txt'
^C
myuser@myhost:~$ ls
important_files hoge001 fuga001 documents


-Iフラグを立てる

rmには-Iというフラグがあります(-iとは異なる)。これは4個以上のファイルを削除しようとしたときにだけ該当するファイル数を表示して確認するというもので、ミスって消そうとすると大量のファイルがヒットして確認が求められます。ただしファイルごとにyと答えないといけない-iと異なり、一度yと押すと全削除が実行されます。

再帰的削除の場合はファイル数に関係なく確認してくるので、-rと併用すると常に確認が表示されます。だが一度押すといいし、大事なファイルを消さないことを考えると仕方ないような気もします。

myuser@myhost:~$ rm -vrfI hoge*

rm: remove 100 arguments recursively? n
myuser@myhost:~$


参考

やっぱりプログラマは誰もが通る道ですね :-(