rm -rfでやらかした!
先日**rm -rf ~/**を誤って実行してしまいました。
バックアップは取っていたので大事には至らなかったのですが、復旧が面倒だったので失敗から学ぶ方法を考えることにしました。
私の案としては、rm -iのように実行する前に今から消すディレクトリに確認を取るように設定することを本記事で提案します。
# こういう確認メッセージが欲しい。
$ alias rm='rm -i'
$ touch hoge
$ rm hoge
remove hoge?
動作確認済み環境
Ubuntu 20.04 (bash)
MacOS Catalina (zsh)
作成したもの
まず、単純にシェルスクリプトを書いて、それにエイリアスを通そうと考えました。
# ダメな例
alias 'rm -rf'='hoge.bash'
# 定義できるけどなんかダサい
alias rm-rf ='hoge.bash' #rm とオプションの間のスペースがない。
どうやらaliasにスペースを含んだものを定義できないようです。
そこでbashrcに直接rm関数を定義してオプションにr,fが含まれている場合のみ確認を表示するようにしました。
bashrcに以下の関数をコピペするだけで使用できます。
function rm(){
DIR=`eval echo '$'$#`
OPTION=${@%*$DIR} #パターンマッチングで引数全体からディレクトリ名を除いたオプション部分
if [[ $OPTION =~ r && $OPTION =~ f ]]; then #オプションにr,fが含まれているか正規表現によるマッチング
echo "rm -rf: remove directory $DIR? [y,n]"
read yesnojudge
case "$yesnojudge" in
"y")
command rm $@ #元のrmコマンドを実行
;;
"n")
:
;;
?)
echo INVAILED OPTION
;;
esac
else
command rm $@
fi
}
実行イメージ
$ rm -rf hoge
remove directory hoge? [y,n]
確認メッセージが表示されyを打つとrm -rfが実行されます。
最後に
何かいい案が他にありましたらコメント欄で教えていただけると幸いです。