以过往的经验来看,Unix用户最多见的一个问题是没法恢复意外删除的文件和目录。键入 rm xyz 以后,一旦你按下RETURN键,那么一切都是浮云了。这个问题的一个解决方案是秘密的、自动的存档文件和目录。想象一下,这个脚本中的基本工做能够作的让用户毫无察觉。 shell
#!/bin/sh # newrm.sh, 一个rm命令的替代品, # 经过在用户的家目录下创建并利用一个新目录,提供了一个非删除的能力 # 它能够处理目录,也能够处理独立的文件, # 若是用户提供了-f 选项,那么删除时就不会存档 # 重要警告:若是你要自动完成删除垃圾目录的工做,那么不要使用 # 该脚本,由于这意味着你事实上什么也没有删除,最终你的磁盘空间会爆满 mydir="$HOME/.deleted-files" realrm="/bin/rm" copy="/bin/cp -R" if [ $# -eq 0 ]; then # 让 'rm' 输出用法错误信息 exec $realrm #当前的shell被 /bin/rm替换掉 fi # 解析全部选项查找'-f' flags="" while getopts "dfiPRrvW" opt; do case $opt in f)exec $realrm "$@" ;; # exec 让咱们直接退出这个脚本 *)flags="$flags-$opt" ;; # 别的选项是给 'rm'的,不是咱们 esac done shift $(($OPTIND-1)) # 确保$mydir存在 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 # 请给点隐私 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 "$@" # 咱们的shell被realrm替换掉脚本如何工做:
这个脚本中有不少值得思考的地方。注意到错误信息大部分都是调用realrm生成的,无论是错误的选项或是文件、目录名。一样,exec命令,用新的指定的进程替换了当前进程,也是能够的。exec一调用realrm,它就实际上退出了脚本,咱们肯定了从进程realrm(/bin/rm)获得的返回码返回给了调用的shell,并无丢弃。由于这个脚本私下里创建了一个目录在用户的家目录下,它须要肯定那儿的文件不能由于没有设置好umask的值而意外的对于别人是可读的。因此,这个脚本使用了chmod命令。最后,有点困惑的文件命名使用了basename命令去掉全部的路径信息,而后增长了时间和日期戳来给删除掉的文件命名,具体的格式是:秒.分.时.天.月.文件名 spa
newname="$mydir/$(date "+%S.%M.%H.%d.%m.").$(basename "$arg")"注意2个$()的应用。这个可能有点复杂,但颇有用。记住,在$(和)之间的任何东西都会被提供给一个子shell,而且命令的结果是被替换过的。为何用一个麻烦的时间戳?由于咱们删除的文件有不少,其中不免有重名的。
alias rm=yourpath/newrm.sh注:取消这个别名的话,就用unalias rm。 运行结果: 直接在命令行上运行,而后到你的家目录下的隐藏目录.deleted-files下查看下就好了。