Linux系統的rm命令太危險,一不當心就會刪除系統文件。寫一個shell腳原本替換系統的rm命令,要求當刪除一個文件或者目錄時都要作一個備份,而後再刪除。shell
假設有一個大的分區/data/,每次刪除文件或者目錄前,都要在/data/下面建立一個隱藏目錄,以日期/時間命名,好比/data/.201802021054,而後把全部刪除的文件同步到該目錄下面,可使用rsync -R把文件路徑一同同步bash
答案:ide
#!/bin/bash d=`date +%Y%m%d%H%M` read -p "Are you sure delete the file or directory $1? y|n:" c if [ $c == "y" ] || [ $c == "Y"] then mkdir /data/.$d rsync -aR $1/ /data/.$d /bin/rm -rf $1 elif [ $c == "n"] || [ $c == "N"] then exit 0 else echo "Please input y or n" fi
解析:首先聲明一個變量$d,將日期命令(date +%Y%m%d%H%M)的執行結果賦值給變量d,這裏用到了反引號(``),做用就是將反引號中命令的運行結果反饋出來。使用read -p 將輸入結果賦值給變量$c。spa
使用if進行判斷,這裏首先說明幾個命令的做用,[]中括號裏面是判斷的條件,兩邊都要有空格,條件判斷符「==」兩邊也要有空格, ||是或者的意思。那麼,整段的含義是:若是$c全等於字符串y或者Y,則執行 mkdir 建立文件夾,執行rsync同步命令,最後執行刪除命令。再若是,$c全等於字符串n或者N,則退出,不然(以上兩種狀況都不包含,輸出echo「please input y or n」)。排序
單獨說明 rsync -aR $1/ /data/.$d。其實完整的寫法應該是 rsync -aR $1/ /data/.$d/$1,可是這樣寫,若是$1的值爲一個絕對路徑,如:/tmp/1.txt,那麼代入會發現內存
rsync -aR /tmp/1.txt /data/.201802021122//tmp/1.txt。多了一個/會報錯,因此省略了/$1,避免這種狀況。字符串
答案二:input
不知道哪一個分區有剩餘空間,在刪除以前先計算要刪除的文件或者目錄大小,而後對比系統的磁盤空間,若是夠則按照上面的規則建立隱藏目錄,並備份,若是沒有足夠空間,要提醒用戶沒有足夠的空間備份並提示是否放棄備份,若是用戶選擇y,則直接刪除文件或者目錄,若是選擇n,則提示未刪除,而後退出腳本。同步
#!/bin/bash d=`date +%Y%m%d%H%M` ##將日期命令的執行結果賦值給變量$d f_size=`du -sk $1 |awk '{print $1}'` ##du -sk $1 是以kb爲單位列出$1的大小總和.結果爲 大小 文件名 如:4 1.txt ##因此只打印管道符前命令的結果的第一段,也就是 大小 文件名的第一段, 大小 ##將運行結果賦值給變量$f_size disk_size=`LANG=en; df -k |grep -vi filesystem |awk '{print $4}' |sort -n |tail -n1` ##LANG=en爲顯示語言爲英文,df -k是查看已掛載磁盤的總容量,使用容量,剩餘容量 ##awk '{print $4}'打印第四段,因df -k 顯示的排序爲 文件系統(filesystem),塊,已用,可用 ##sort -n 使用純數字排序,從小到大 ##tail -n1 打印最後一行 ##整段代碼的含義就是,將最大的可用內存打印出來,賦值給變量disk_size big_filesystem=`LANG=en; df -k |grep -vi filesystem |sort -n -k4 |tail -n1 |awk '{print $NF}'` ##LANG=en顯示語言爲英文,df -k 查看已掛載磁盤的總容量,使用容量,剩餘容量 ##grep -vi 不區分大小寫打印不包括 filesystem的行 ##tail -n1 打印最後一行 ##打印最後一個段,也就是掛載點名稱 ##h整段代碼是將最大可用內存的掛載點名稱打印出來,賦值給變量$big_filesystem if [ $f_size -lt $disk_size] ##判斷$f_size的值 是否小於 $disk_size的值,若是小於則執行 then read -p "Are you sure delete the file or directory:$1? y|n:" c ##將輸入的內容賦值給變量$c if [ $c == "y"] || [ $c == "Y"] ##判斷 $c的值是否全等於 y或Y then mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/ && /bin/rm -rf $1 ##mkdir -p 級聯建立目錄,最大剩餘掛載點/日期,rsync -R是連同目錄一同同步, ##整段就是在最大掛載點下建立以日期爲名稱的文件夾,使用rsync命令一同同步,最後刪除$1文件 elif [ $c == "n"] || [ $c == "N"] ##判斷變量$c的值是n或N,則退出 then exit 0 else echo "please input y or n" ##若是$c的值不等於y,Y,n,N,則輸出 please input y or n fi else echo "the disk size is not enough to backup the files $1" ##變量$f_size的值不小於$disk_size的值,則執行下面命令 read -p "Do you want to delete $1? y|n:" c if [ $c == "y"] || [ $c == "Y"] ##$c=y|Y then echo "it will delete $1 after 10 seconds whitout bachup." ##則輸出 for i in `seq 1 10` ##for循環,1到10,10次循環 do echo -ne "=" ##echo -ne不換行輸出 = sleep 1 ##sleep 1延遲1秒 done echo /bin/rm -rf $1 ##刪除$1文件 elif [ $c == "n"] || [ $c == "N"] ##$c =n|N then echo "it will not delete $1" ##則輸出 it will not delete。。 exit 0 ##退出 else ##以上狀況不存在,則輸出 echo "Please input y or n" fi fi
-------習題來源阿銘Linux--------
it
以上僅爲我的理解,不正之處請指出,謝謝。