どせいたんさき。

ナスダヨー

まちがってrmってしまわないためのスクリプト更新

たびたび変更しているスクリプト altrm をまたまた更新.変更点は,

  1. rm にもともとあるオプションを実行
  2. ターゲットがディレクトリの時は圧縮してからゴミ箱へ.


絶対パス取得のコードは http://code.nanigac.com/source/view/612 を参考にした.getopts なんて使ったのも久しぶりですっかり忘れていたので を参考にした.

以下スクリプト多分動く.ちゃんとうごいていない.

追記[07/05]:とりあえず訂正しました.

#!/bin/bash -f

# input the trash directory
TRASH=/directory/for/trash

# if not exist, make the directory
if [ ! -d $TRASH ]
then
  mkdir -p $TRASH
fi

# option parser
OPTION="-n"
OPT_R=''
while getopts fiIrRv OPT
do
  case $OPT in
    [f] ) OPTION="${OPTION}";;
    [iI]) OPTION="${OPTION}i";;
    [rR]) OPT_R='on';;
    [v] ) OPTION="${OPTION}v";;
  esac
done
shift $(($OPTIND-1))

# rename function
function _fullpath () {
  cd `dirname ${1}`
  echo ${PWD}/`basename ${1}`
  cd ${OLDPWD}
}
function _delname () {
  _fullpath $1  | sed 's/^\///' | sed 's/\//-/g'
}
function _testdir () {
  find $(_fullpath $1)/ -mindepth 1 -print0 2>/dev/null
}


# move to trash
for i
do
  if [ ! -e "${i}" ]; then
## error
    echo "Cannot remove ${i}: file not exist" >&2
    continue
  fi
  DATE=`date +'%Y%m%d%H%M'`
  DELFILE=${i%/}
  DELNAME=`_delname ${DELFILE}`
  if [ -d ${i} ]; then
    if [ -z `_testdir ${DELFILE}` != '' -a -z "${OPT_R}" ]; then
      echo "Cannot remove ${DELFILE}: directory not empty" >&2
      continue
    fi
## directory
    cat <<EOF | bash
tar czf $DELNAME.tgz.$DATE $DELFILE
mv $OPTION $DELNAME.tgz.$DATE $TRASH/.
rm -r $DELFILE
EOF
  else
## standard file
    cat <<EOF | bash
mv $OPTION $DELFILE $TRASH/$DELNAME.$DATE
EOF
  fi
done


エラーが出たので追記(09.06.2010)

#!/bin/bash -f                                                                       

# input the trash directory                                                          
TRASH=/backup/.trash

# if not exist, make the directory                                                   
if [ ! -d $TRASH ]
then
  mkdir -p $TRASH
fi

# option parser                                                                      
OPTION="-b"
while getopts fiIrRv OPT
do
  case $OPT in
    [f] ) OPTION="${OPTION}";;
    [iI]) OPTION="${OPTION}i";;
    [rR]) OPT_R='on';;
    [v] ) OPTION="${OPTION}v";;
  esac
done
shift $(($OPTIND-1))

# rename function                                                                    
function _fullpath () {
  cd `dirname ${1}`
  echo ${PWD}/`basename ${1}`
  cd ${OLDPWD}
}
function _delname () {
  _fullpath $1  | sed 's/^\///' | sed 's/\//-/g'
}
function _testdir () {
  find $(_fullpath $1) -print0 2>/dev/null
}

# move to trash                                                                      
for i
do
  if [ ! -e "${i}" ]; then
## error                                                                             
    echo "Cannot remove ${i}: file not exist" >&2
    continue
  fi
  DATE=`date +'%Y%m%d%H%M'`
  DELFILE=${i%/}
  DELNAME=`_delname ${DELFILE}`
  if [ -d "${DELFILE}" ]; then
    if [ ! `_testdir ${DELFILE}` = `_fullpath ${DELFILE}` -a -z "${OPT_R}" ]; then
        echo "Cannot remove ${DELFILE}: directory not empty" >&2
        continue
    else
## directory                                                                         
    cat <<EOF | bash                                                                 
tar czf $DELNAME.tgz.$DATE $DELFILE                                                  
mv $OPTION $DELNAME.tgz.$DATE $TRASH/.                                               
rm -r $DELFILE                                                                       
EOF                                                                                  
    fi
  elif [ -e "${DELFILE}" ]; then
## standard file                                                                     
    cat <<EOF | bash                                                                 
mv $OPTION $DELFILE $TRASH/$DELNAME.$DATE                                            
EOF                                                                                  
  else
## tmp                                                                               
    echo "Cannot remove ${DELFILE}: something wrong" >&2
  fi
done