2011-01-06

安全な rm

Linux では, rm で削除したファイルを復元する機能が提供されていません. そこで, rm をゴミ箱に移動するコマンドに置き換える方法を紹介します. ここで紹介する機能は,
  • ゴミ箱ディレクトリを作る
  • 削除するファイルがゴミ箱ディレクトリと同じファイルシステム上にあればゴミ箱に移動する.
  • 削除するファイルのあるファイルシステム上にゴミ箱ディレクトリがなければ, プロンプトを出して削除する.
を備えています.

ファイルを削除する代わりに, 同じファイルシステムにあるゴミ箱ディレクトリに移動させます. その副作用として, 削除が高速になります. ファイルの移動は, ファイルの実体への参照を書き換えるだけで行える実装になっているファイルシステムがほとんどだからです.

function rms
{
 # safe rm
 local rm_opt='-v -i'
 local mv_opt=''
 OPTIND=0
 while getopts firv flag; do
  case $flag in
   f) mv_opt="$mv_opt -f";;
   i) mv_opt="$mv_opt -i";;
   r) rm_opt="$rm_opt -r";;
   v) mv_opt="$mv_opt -v";;
   *) OPT_ERROR=1; break;;
  esac
 done
 if [[ $OPT_ERROR ]]; then
  echo "usage: $0 -firv files..." >&2
  exit $OPT_ERROR
 fi
 shift $((OPTIND-1))

 local trashes=(
  ~/.trash
  /tmp/trash-$USER
  )
 mkdir "$trashes" &>/dev/null
 local i t
 local date=$(date +'%Y%m%d-%H%M%S')
 for i in "$@"; do
  local found=''
  for t in ${trashes[@]}; do
   if test "$(stat -c '%D' "$i")" = "$(stat -c '%D' "$t")"; then
    local tt=$t/$date/
    mkdir $tt &>/dev/null
    mv $mv_opt "$i" $tt && local found=1
   fi
   test -n "$found" && break
  done
  test -z "$found" && /bin/rm $rm_opt "$i"
 done
}
alias rm=rms

0 件のコメント:

コメントを投稿