1. 程式人生 > >防止誤刪檔案!將rm命令改造成mv命令簡易版

防止誤刪檔案!將rm命令改造成mv命令簡易版

    今天在用rm -rf的時候突發奇想,如果我一不小心刪錯了該咋辦,平時粗心大意的我感覺自己很容易犯這樣的錯誤。於是去百度搜了一下,發現好多人都犯過這種錯誤!有的還帶來很大的損失!而且rm命令刪除檔案之後很難恢復。

    所以很多人建議用alias將rm替換成mv,也就是設定一個自己的垃圾桶,在rm的時候將檔案移動到垃圾桶中而不是直接刪除了。這樣就相當於有了備份。而這個垃圾桶可以crontab設定定時任務一週清除一次,通過這種方式就可以避免手殘帶來的損失。

    瞭解大體思路之後我就自己改造了一下rm命令,沒做多少測試,先自己將就用著,有bug再說吧,我的系統是macOs,跟linux應該大同小異。

首先來改alias,將rm命令替換為我自己寫的指令碼,macOs上沒找到alias命令,於是我修改了/etc/profile檔案,這個檔案每次開機的時候會被讀取,對所有使用者有效,修改如下:

alias rm='sh /Users/db/rm_delete_files/trash.sh'

其實就是執行指定目錄下的指令碼。

然後就是指令碼的程式碼,開始犯的錯是以為傳給指令碼的引數只有最多兩個,然而我在rm -f test.*的時候發現引數並不是兩個,而是等於符合test.*形式的檔案的個數,所以程式碼最後來了個while迴圈遍歷mv:

#!/bin/sh

date=`date +%F`                              #當前日期
path="/Users/db/rm_delete_files/"$date       

if [ ! -d $path ]; then       
  mkdir $path                            #建立一個目錄
fi

str=$1                                #第一個引數
first_char=${str:0:1}
if [ $first_char = '-' ];then          #第一個引數是-f或者-rf,shift到第二個引數
  shift
fi

while [ $# != 0 ];                     #遍歷所有的引數,mv到指定path
do
  mv -f $1 $path
  shift
done

暫時測的case還不多,可能還不夠完善。能支援類似於rm -f test.c 、rm -rf  dir、rm test.c、rm -f test*、rm -rf dir/*等刪除命令,但是不支援引數分開寫的比如 rm -f -r dir等。

日後再逐漸完善,這樣做了保障就不怕自己以後手殘啦。

ps:好像定時刪除垃圾桶還沒做,等有時間再做吧。