僕がMacのホームディレクトリを削除するに至った経緯と、復元するまでの道のり

最初に結論から申し上げますと、僕 @kadoppe はアホです。大馬鹿者です。

この度、仕事にフル活用しているMacBook Proのホームディレクトリ(/Users/<ユーザ名>)を削除するという愚行を働いてしまいました。

具体的に何をしたのか。それは、以下のコマンドの実行です。

コマンドにあまり詳しくない人のために説明すると、この短いコマンドをターミナルを開いて実行するだけで、有無を言わさずホームディレクトリの削除が開始されてしまう、恐怖のコマンドです。良い子は危険だから真似しちゃダメだよ!

ではここからは、僕は何故こんなことをしてしまったのか、その経緯を言い訳がましく説明したいと思います。恥ずかしいですが、二度とこんなことを繰り返さないようにするために。

「~」という名前のディレクトリ

通常「~」(チルダ)という記号はホームディレクトリを表します。~/はMacだと実際には/Users/<ログインユーザ名>という形に展開されますね。

このように、「~」は少し特殊な意味を持った記号です。

実は僕のMac上では、少し前から、この「~」が思わぬ場所に出現するようになっていました。

以下、僕が普段作業しているディレクトリ(Railsアプリケーション)のファイルリストです。

おや?一番下に何やらおかしい名前のディレクトリがありますね。そう、「~」です。こんなところに「~」ディレクトリができてしまっているんです。

~」ディレクトリが作られた理由

僕は普段、Railsアプリケーションの開発にGuardというファイル監視ツールを使っています。

上述の「~」ディレクトリが作られたのは、実はこのGuardのバグが原因です。

call File.expand_path on history_file by martoche · Pull Request #401 · guard/guard

どうやら、Guardがログファイルをホームディレクトリに出力するときの処理にバグがあり、Railsアプリケーションのルートディレクトリに「~」ディレクトリを作成されるようになっていました。

そして悲劇は起きた

Guardのバージョン1.7.0で、上述のバグは解消。

僕も早速アップデートし、もう作成されることのない「~」ディレクトリを削除しようと試みました。

さてみなさん。カレントディレクトリがRailsアプリケーションのルートディレクトリになっている状況で、この「~」ディレクトリを削除しようとする場合、どんなコマンドを実行しますか?

正しいコマンドは以下。

チルダを\でエスケープしなければなりません。でも、僕は間違えて以下のコマンドを実行してしまいました。

エスケープもしてないですし、rmコマンドにfオプションもつけてしまっています。

これだと、コマンドを実行した瞬間から、有無を言わさずホームディレクトリの内容が削除され始めてしまいますね。

「あれ?なんでこんなに時間がかかるんだろう?あっ!!」と気づいて、コマンドの実行を中止したときには時すでに遅し。

すでに、結構な量のファイルがホームディレクトリから削除されてしまったあとでしたorz。

復元するまでの道のり

まず、すぐにDropboxのアプリケーションを終了。幸いDropbox内のファイルは消されておらず、WebブラウザからDropboxの変更履歴を確認しても、被害は全く無かった模様。ほっ。

次に、その日の仕事中の作業内容が失われていないかチェック。すべての作業内容はリモートのGitリポジトリにPush済みだったので、「その日の作業がパー」という最悪の状況は免れました。

ここまで被害状況を大体把握できたので、次はTime Machineを使ってファイルの復元にチャレンジ。

Time Machineによって自動バックアップが、事件が起きた日の朝に作成されていたことがわかったので、optionキーを押しながらMacを再起動し、リカバリー領域からTime Machineによる復元を実行!

一旦ディスクの内容が全部削除されたあとに、きちんと復元が行われ、無事何事もなかったかのように、Macをその日の朝の状態に戻すことに成功しました。

反省点

今回の一番の反省点はrmコマンドにfオプションをつけて実行してしまったこと

fオプションをつけることで、ディレクトリ内のファイルが確認なしに削除されてしまいます。

普段はfオプションを付けることはほぼないのですが、今回は「どうせゴミファイルだから」と油断してしまいました。

今後は、どんなディレクトリでも横着せずに、中身のファイルを確認しながら、削除したいと思います。猛反省。

やっててよかったと思うこと

まずは何よりも、Time Machineでバックアップをきちんと取っていて、本当によかったです。

家のLANにMacが接続されているときは、特に意識することなく、自動的にTime Machineによるバックアップが1時間おき実行されるように設定しています。

もちろん、最後にバックアップが実行されてから行った変更は失われてしまいますが、それでも、被害を最小限に食い止めるために、Macユーザなら必ず使っておきたい機能だと思います。

そして、作業内容をこまめにリモートリポジトリに送っていたことも本当によかった。

普段、GitHub Flowという開発フローにのっとって開発を進めているのですが、できるだけ細かくコミットを行い、1回コミットしたらすぐにリモートリポジトリにPushすることを徹底していたおかげで、その日の作業内容を全てロスしてしまうような事態を避けることができました。

まとめ

繰り返しますが、僕は本当にアホです。

でも、アホじゃなくても、人間はミスを犯してしまうもの。

万が一、今回のようなことが起こった時に備えて、常日頃から準備を怠らないことが重要だと、今回の件を通して再確認しました。

みなさんはきちんとバックアップを取っていますか?こんな僕の失敗談がどこかの誰かの助けになれば幸いです。

それでは!

  • 通りすがり

    ヘタレなのでmv -i ~ /tmp を使ってます。rm -rfはよほどの事情がないと使いません。

  • 通りすがり2

    だいぶ時間が経ってしまっているようですが、同じ悲劇をしてしまった者としてコメントさせて頂きます。僕はeditorとしてemacsを使っているのですが、編集してsaveする度にback upとしてお尻に’~’のついたfileが生成されます。色々編集しているうちに、1つのdirectoryの中に10個以上お尻に’~’のついたfileができてしまい、一気に削除する為に、通常なら
    rm -f *~
    とすればいい所を、
    rm -rf ~
    としてしまいました。’*’をつけるか’r’をつけないかのどちらかでもやっていれば悲劇にはならなかったのですが・・・
    すぐに異常に気づいてCtrl+cで止めましたが、半分以上削除されている状況でした。。。
    幸い、消えてしまった分はTime Machineのback upとその時にアプリケーションで開いていたfile(大量に開いていたので)をそのまま保存するくらいでほとんど復旧できました。
    さらにその頃、Time Machineが異常になっていて、back upをとるにも遅すぎて2,3ヶ月ほどback upをとれていない状況だったのですが、これを機にTime Machineも復活してちゃんとback upとれるようになりました。