12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

先日Xcodeが重かったので、rm -rfコマンドを使ってキャッシュを削除しようとしたところ、手が滑ってディレクトリごと削除かけてしまいました…。そこから2時間ほどで復旧できたのでその過程と、今後起きないようにするための防止策を備忘録として残します。

目次

なぜ事故ってしまったのか

冒頭でも記載させていただきましたが、Xcodeのキャッシュを消そうとして、以下のコマンドを打とうとしました。

rm -rf ~/Library/Developer/Xcode/DerivedData

しかし、途中でシフトを押そうと思ったところ、手が滑ってEnterを押してしまい、以下のようになっていました。

rm -rf ~

\(^O^)/

みなさんお察しの通り、ホームディレクトリ内の全ファイル・ディレクトリが確認なしで削除されるという超危険コマンドを実行していまいました。

一瞬何が起きたかわからず、どんどん削除が進んでいき頭が真っ白になりました。ようやく状況を理解し、慌ててキャンセルしたので、7割ぐらいのフォルダやファイルは生きていました。が、残りの3割である開発していたGitのリポジトリはなくなってしまいました。(リモート上にはあるけどかなりの量をpushしていなかったのでほぼやり直し状態に。)

復旧までに試したこと

復旧までに試してみたことは以下です。

  1. Time Machineでの復元
    自動バックアップを有効にしていなかったため、こちらでの復元はだめでした。

  2. APFS ローカルスナップショットの確認
    確認のために以下を実行してみましたが、残っていませんでした。

    tmutil listlocalsnapshots / 
    
  3. VSCodeの化石(?)とVSCode Timelineでの復元
    幸いにも消えたのがGitのプロジェクトのみだったので、VSCodeの化石(開いていたので、画面上に残っていたファイルがいくつかありました)とVSCode Timelineで、pushしていなかったファイルのうち、6割ぐらい戻すことができました。
    残りの4割は己の記憶を頼りに頑張りました。

ちなみに、rm -rfではゴミ箱を経由しないため、ゴミ箱には当たり前ですが何も残っていませんでした。

再発防止のために行ったこと

rmコマンドにガードを入れる

.bashrcに以下のガードを入れ、rm -rfを押すときにアラートが出る様にしました。

function rm () {
  local ask=false
  if [[ "$1" == -*f* ]]; then
    shift
    [[ $# -eq 0 ]] && ask=true
  fi
  for arg in "$@"; do
    [[ "$arg" == "/" || "$arg" == "$HOME" ]] && ask=true
  done
  if $ask; then
    echo -e "\e[31m( ;∀;)消していいの?WoWWow\e[0m"
    read -r -p "→ y = 実行 / n = 中止: " yn
    [[ "$yn" =~ ^[Yy]$ ]] || { echo "キャンセルしました"; return 1; }
  fi
  command rm "$@"
}

反映されているかを確認するためにtype rmを実行したところ、rm is a functionと出てきたので、誤って手打ちでコマンドを打っても画像のように確認が入るようになりました。(安全な状態でテストしています)

image.png

safe-rmを導入する

上記の関数だけだと、対話シェルの誤爆しか防げないため、safe-rmも導入しました。
Macの場合は以下のコマンドでインストールできます。

brew install safe-rm

インストールしたら、以下のようにsafe-rmを通常のrmとして動くように設定していきます。
まずは、safe-rmの場所を確認します。

which safe-rm

この結果、/usr/local/bin/safe-rmが来たとします。
その後、パスの先頭にあるディレクトリへrmのシンボリックリンクを作成していきます、。

# /usr/local/binが先頭に来るようにパスを設定している場合
ln -s "$(which safe-rm)" /usr/local/bin/rm

これで、rmを打った時に、safe-rmが実行されるようになりました。

この後は、設定ファイルで削除を禁止するパスを指定したら終了です。
私は以下のような設定にしました。

sudo tee -a /etc/safe-rm.conf <<EOF
/bin
/sbin
/System
/Users/自分のユーザ名/
EOF

おわりに

正直こんなミスを3年目になってやるとは思っていませんでした。。2時間ぐらいで復旧できたとはいえだいぶメンタルがやられました。
改めてみなさんにお伝えしたいことは、以下4点です。

  • 危険なコマンドはあらかじめ回避できるように設定しておく
  • バックアップは常に取る
  • Gitはプッシュしておく
  • コマンドの手打ちはしない

特にバイブコーディングをする方が増えてきて、思わぬファイルを削除されてしまった!ということもあると思うので、万が一に備えてsafe-rmによる防止策も実施しておくと安心だと思います。

12
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?