rmコマンドに悩んだらmvコマンドで/tmpに移動させてもいいんだよ


rmについては話題性に富み、枯れた議論かと思いますが、エンジニア歴が長い方から教えていただき目から鱗であったTipsで、僕が適当かつバランス良くエンジニアとしてやっていく上でとても役に立っているTipsを一つ紹介させてください。

言いたいこと

rm コマンドで、ファイル削除に戸惑うなら /tmp ディレクトリに移動させておけばOK
(ただし、ファイルサイズには注意を)

方法

rm foo.txt であれば、 mv foo.txt /tmp/ にするだけです。

マサカリ回避用防護壁(=補足)

僕には、マサカリが鋭利すぎるので、補足します。

そもそも rm は慎重に実行すべきでしょう

はい。
そもそも、消えたらまずいものがある環境に接続していること自体が慎重になるべきことで、それに輪を掛けてrmを実行するなど慎重に慎重を重ねて「慎重のミルフィーユ」と呼べるようなものを作れる程度に慎重になるべきだと慎重に考えて慎重にQiitaに書いた次第であるので、慎重にならないことなど想定するべきないと慎重に考えておりますが、そんな慎重なんて気分や体調次第や忙しさで忘れてしまうのが人であり組織だと思います。1

/tmp ディレクトリ配下は勝手に消えるのか?

はい。
ディストリビューションにもよりますが、だいたい消えるという理解で間違いないと思います。2

/tmp が1分後に消えたり、再起動時に消えてたらrmでよくない?

はい。
たいして変わんないです。
ただ、今すぐ消えるか、1分後も残っているかでは、だいぶ気持ちの持ちようが変わってくると思います。3

/tmp の容量が足りなくなったりしない?

はい。
ありえると思います。ファイルサイズによってはとても良くないと思います。
rmコマンドで面倒な事になるか、容量不足で面倒なことになるかのどっちかだと思ってます。
ただ、一時的な用途に限るはずのディレクトリですから、中身を全部削除するとしても、心理的なハードルはすごく下がると思います。
参考になるとても良い記事: /tmpと/var/tmpの仁義無き戦い

どんなときでも有効な話じゃないので参考にならなくない?

はい。
「この文章は日本語で書かれている」みたいに絶対的な話ではなく、環境依存する話なのに環境の話がないからそういうことを言うのかと思います。その通りだと思います。 4

経緯

長い割に本題から外れ気味だったので注釈にしました。気になるようでしたら注釈を読んでください5


  1. 仕組みが面倒だとズルをしたくなるじゃないですか、こんな感じにコレだけ慎重に慎重にって言ったら、面倒くさくなってしまいズルをして、ズルをした結果やらかすことが往々にしてあると思ってます。 

  2. 3日後に消えているかもしれません。再起動したら消えているかも知れません。誰かが再起動したから直後に消えてるかもしれません。(消えない場合は意図的にそうしているか、そういうOSでないか等々の理由がありますが、長くなるので割愛します。他の記事を探してください。) 

  3. そもそも論を言うならば、今すぐ削除する(読み込めなくする)必要があるファイルってあんまりないと思います。そのため、 mv で /tmpに移動しても良いと思ってます。 

  4. だいたい Linux ってよばれてるOSについてはある程度つかえるTipsだと思いますが、RHELの〜とかUbuntuの〜とかそういう細かい話を調査してまとめるのが手間だったので省かせてもらいました。あと、少し前のmacOSとかでも3日後に消えるらしいので、macでも使えると思いますが、macOS Mojaveで、なんか消えてない気がしますので、参考にしていただく際はご自身でご自分の環境について確認いただければとおもいます。 

  5. 仲良くさせていただいている方に、 rm -rf ./大切なファイル(ディレクトリ)を、とてもとても大切な環境で実行したことがある方がいます。これは、その方が涙目になりながら、教えてくださったTipsです。あの時、/tmpに移動していれば... と後悔されていました。(結局、なんとかなったと聞きましたが)不幸なことになるチームや人を減らすために書かせてもらいました。個人的な思い1としては、プログラマになり、自身のローカルのDockerやVagrant、もしくはリモートに存在する環境上で作業することが出てくると思います。その際に、ファイルを消したい... ということが往々にしてあると思います。ただ、そのファイルをあとで見たいと思うことないでしょうか。もしくは1時間後に見たいと思うことは無いでしょうか。たしかに、自身のターミナルのログを保存している(もしくは履歴が追える)のであれば、catしておくとかであとから見直すことも可能です。ただ、経験上、面倒くさいとおもってます。似たようなログがあったら「どれだ!?」ってなりました。そのため、取り敢えず削除したいなーって場合は /tmp に移動させています。個人的な思い2としては、本番環境でrmコマンドを使う場合もできる限りmvコマンドで代用してます。理由は、「取り返しの付かないファイル削除」もしくは「削除して慌てるようなファイルをやってしまう」ということを防げるためです。基本はmvでやって、どうしても削除しないと行けない場合のみ、慎重にrmコマンドを打つように心がけすることができます。個人的な思い3としては、shell スクリプトに入っていたrmコマンドで事故っているところをみたことがあります。被害は非常に軽微でしたが、見ていて変な汗が手からでてきました。その時も、/tmpに移動していれば、「/tmpから戻せばいいじゃろ」って冷静に対処できたと思います。当然、復旧させる方法もググれば一杯出てきますが、ググって探して方法を特定するまでドキドキしているところを見てるのがいやでした。あと結局復旧ではなく再度作り直すでなんとかしていたようです。