Linux系統的rm命令太危險,一不當心就會刪除系統文件。寫一個shell腳原本替換系統的rm命令,

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

以上僅爲我的理解,不正之處請指出,謝謝。

相關文章
相關標籤/搜索