以過往的經驗來看,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下查看下就好了。