将删除的文件存档脚本


将删除的文件存档脚本
 
Unix用户最常见的一个问题是无法恢复意外删除的文件和目录。键入 rm xyz 之后,一旦你按下RETURN键,那么一切都是浮云了。这个问题的一个解决方案是秘密的、自动的存档文件和目录。想象一下,这个脚本中的基本工作可以做的让用户毫无察觉。
 
01
#!/bin/sh
02
  
03
 # newrm.sh, 一个rm命令的替代品,
04
 # 通过在用户的家目录下建立并利用一个新目录,提供了一个非删除的能力
05
 # 它可以处理目录,也可以处理独立的文件,
06
 # 如果用户提供了-f 选项,那么删除时就不会存档
07
  
08
 # 重要警告:如果你要自动完成删除垃圾目录的工作,那么不要使用
09
 # 该脚本,因为这意味着你事实上什么也没有删除,最终你的磁盘空间会爆满
10
  
11
 mydir="$HOME/.deleted-files"
12
 realrm="/bin/rm"
13
 copy="/bin/cp -R"
14
  
15
 if [ $# -eq 0 ]; then     # 让 'rm' 输出用法错误信息
16
     exec $realrm  #当前的shell被 /bin/rm替换掉
17
 fi
18
  
19
 # 解析所有选项查找'-f'
20
  
21
 flags=""
22
  
23
 while getopts "dfiPRrvW" opt; do
24
     case $opt in
25
         f)exec $realrm "$@"   ;; # exec 让我们直接退出这个脚本
26
         *)flags="$flags-$opt" ;; # 别的选项是给 'rm'的,不是我们
27
     esac
28
 done
29
 shift $(($OPTIND-1))
30
  
31
 # 确保$mydir存在
32
  
33
 if [ ! -d $mydir ]; then
34
     if [ ! -w $HOME ]; then
35
         echo "$0 failed: can't create $mydir in $HOME" >&2
36
         exit 1
37
     fi
38
     mkdir $mydir
39
     chmod 700 $mydir  # 请给点隐私
40
 fi
41
  
42
 for arg
43
 do
44
     newname="$mydir/$(date "+%S.%M.%H.%d.%m.").$(basename "$arg")"
45
     if [ -f "$arg" ]; then
46
         $copy "$arg" "$newname"
47
     elif [ -d "$arg" ]; then
48
         $copy "$arg" "$newname"
49
     fi
50
 done
51
  
52
 exec $realrm $flags "$@"   # 我们的shell被realrm替换掉
脚本如何工作: 
这个脚本中有很多值得思考的地方。注意到错误信息大部分都是调用realrm生成的,不管是错误的选项或是文件、目录名。同样,exec命令,用新的指定的进程替换了当前进程,也是可以的。exec一调用realrm,它就实际上退出了脚本,我们确定了从进程realrm(/bin/rm)得到的返回码返回给了调用的shell,并没有丢弃。因为这个脚本私下里建立了一个目录在用户的家目录下,它需要确定那儿的文件不能因为没有设置好umask的值而意外的对于别人是可读的。所以,这个脚本使用了chmod命令。最后,有点困惑的文件命名使用了basename命令去掉所有的路径信息,然后增加了时间和日期戳来给删除掉的文件命名,具体的格式是:秒.分.时.天.月.文件名
 
1
newname="$mydir/$(date "+%S.%M.%H.%d.%m.").$(basename "$arg")"
注意2个$()的应用。这个可能有点复杂,但很有用。记住,在$(和)之间的任何东西都会被提供给一个子shell,并且命令的结果是被替换过的。为什么用一个麻烦的时间戳?因为我们删除的文件有很多,其中难免有重名的。 
运行脚本: 
为了导入这个脚本,简单的添加一个alias,这样你就可以在键入rm的时候,用这个脚本代替了,而不是原来的rm命令。一个Bash/Ksh的alias命令是: 
1
alias rm=yourpath/newrm.sh
注:取消这个别名的话,就用unalias rm。 
运行结果: 
直接在命令行上运行,然后到你的家目录下的隐藏目录.deleted-files下查看下就行了。 
 

相关内容

    暂无相关文章