101个脚本之建立linux回收站的脚本

众所周知,linux是没有回收站的,一些人很害怕删错东西(有经验的linux管理员极少范这错误),个人不建议回收站,而应该是培养个人的安全意识。有点小跑题。
接着回来101个脚本之#15 Archiving Files As They're Removed 就是建立一个linux回收站的脚本

  #!/bin/sh    # newrm, a replacement for the existing rm command, provides a   # rudimentary unremove capability by creating and utilizing a new   # directory within the user's home directory. It can handle directories   # of content as well as individual files, and if the user specifies   # the -f flag files are removed and NOT archived.    # Big Important Warning: You'll want a cron job or something similar to keep   # the trash directories tamed. Otherwise nothing will ever actually   # be deleted from the system and you'll run out of disk space!    mydir="$HOME/.deleted-files"   realrm="/bin/rm"   copy="/bin/cp -R"    if [ $# -eq 0 ] ; then # let 'rm' ouptut the usage error   exec $realrm # our shell is replaced by /bin/rm   fi    # Parse all options looking for '-f'    flags=""    while getopts "dfiPRrvW" opt   do   case $opt in   f) exec $realrm "$@" ;; # exec lets us exit this script directly.   *) flags="$flags -$opt" ;; # other flags are for 'rm', not us   esac   done   shift $(($OPTIND - 1))    # Make sure that the $mydir exists    if [ ! -d $mydir ] ; then   if [ ! -w $HOME ] ; then   echo "$0 failed: can't create $mydir in $HOME" >&2   exit 1   fi   mkdir $mydir   chmod 700 $mydir # a little bit of privacy, please   fi    for arg   do   newname="$mydir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")"   if [ -f "$arg" ] ; then   $copy "$arg" "$newname"   elif [ -d "$arg" ] ; then   $copy "$arg" "$newname"   fi   done    exec $realrm $flags "$@" # our shell is replaced by realrm

我们来说下这个脚本的实现思路
将原本的rm命令用我们这个带有回收站机制的myrm脚本代替(alias别名),脚本将要删除的文件移动到了home下个人目录中以.deleted-files 命名的隐藏文件夹。

接着我们看看这个脚本是怎么实现的

  while getopts "dfiPRrvW" opt   do   case $opt in   f) exec $realrm "$@" ;; # exec lets us exit this script directly.   *) flags="$flags -$opt" ;; # other flags are for 'rm', not us   esac   done

这一段说明 要是命令用带 Cf 选项的话,则不进回收站,调用原本的rm命令。

  for arg   do   newname="$mydir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")"   if [ -f "$arg" ] ; then   $copy "$arg" "$newname"   elif [ -d "$arg" ] ; then   $copy "$arg" "$newname"   fi   done

用for循环顺序处理参数
newname="$mydir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")" 回收站里文件命名.

参与评论