第二章:Improving On User Commands--15.將刪除的文件存檔

   以過往的經驗來看,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的時候,用這個腳本代替了,而不是原來的rm命令。一個Bash/Ksh的alias命令是:
alias rm=yourpath/newrm.sh
注:取消這個別名的話,就用unalias rm。 運行結果: 直接在命令行上運行,而後到你的家目錄下的隱藏目錄.deleted-files下查看下就好了。
相關文章
相關標籤/搜索