防止誤刪檔案!將rm命令改造成mv命令簡易版
阿新 • • 發佈:2019-01-05
今天在用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:好像定時刪除垃圾桶還沒做,等有時間再做吧。