金曜日, 7月 18, 2025
金曜日, 7月 18, 2025
- Advertisment -
ホームニューステックニュース手が滑って全データを飛ばしかけたので再発防止した話 #削除 - Qiita

手が滑って全データを飛ばしかけたので再発防止した話 #削除 – Qiita



手が滑って全データを飛ばしかけたので再発防止した話 #削除 - Qiita

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

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

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

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

\(^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" == "https://qiita.com/" || "$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の場合は以下のコマンドでインストールできます。

インストールしたら、以下のようにsafe-rmを通常のrmとして動くように設定していきます。
まずは、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による防止策も実施しておくと安心だと思います。





Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -