[Linux小技巧] 將 rm 命令刪除的文件放在回收站

自定義rm命令

linux系統的rm命令太危險,一不小心就會刪除掉系統文件。 寫一個shell腳本來替換系統的rm命令,要求當刪除一個文件或者目錄時,都要做一個備份,然後再刪除。下面分兩種情況,做練習:

1. 簡單的實現:

假設有一個大的分區/data/,每次刪除文件或者目錄之前,都要先在/data/下面創建一個隱藏目錄,以日期/時間命名,比如/data/.20170327/,然後把所有刪除的文件同步到該目錄下面,可以使用rsync -R 把文件路徑一同同步,示例

#!/bin/bash
#name:南宮乘風
#email:[email protected]
fileName=$1
now=`date +%Y%y%d`
dir=$(/data/$now)
read  -p "你確定刪除這文件或者目錄嗎 $1 ? yes|no :" input
if [ $input == "yes" ] || [ $input == "y" ]; then
     # 判斷目錄是否存在
     if [ ! -d $dir ]; then
        mkdir /data/$now
    fi
    # rsync同步要刪除的文件和目錄
     rsync -aR $1/ /data/$now/$1/
     rm -rf $1
    
elif [ $input == "no" ] || [ $input == "n" ]; then
     # 選擇no退出
     exit 0
else
     # 如果選擇別的輸入符,提示
     echo "只能輸入yes或者no"
     exit 0
fi

2.複雜的實現:

不知道哪個分區有剩餘空間,在刪除之前先計算要刪除的文件或者目錄大小,然後對比系統的磁盤空間,如果夠則按照上面的規則創建隱藏目錄,並備份,如果沒有足夠空間,要提醒用戶沒有足夠的空間備份並提示是否放棄備份,如果用戶輸入yes,則直接刪除文件或者目錄,如果輸入no,則提示未刪除,然後退出腳本,示例: 

#!/bin/bash
#name:南宮乘風
#email:[email protected]
now=$(date +%Y%m%d)
#判斷文件大寫
f_size=$(du -sk $dir | awk '{print $1}')
#判斷磁盤大小
disk_szie=$(df -k| grep -vi filesystem | awk '{print $4}'|sort -n|tail -n1)
#判斷最大的目錄在哪裏
big_filesystem=$(df -k|grep -vi filesystem | sort -n -k4 | tail -n1 | awk '{print $NF}')
#判斷文件大小和磁盤大小比較
if [ $f_size -lt $disk_szie ]; then
     # 輸入選項,準備開始刪除工作
     read  -p "你確定刪除這文件或者目錄嗎 $1 ? yes|no :" input
    if [ $input == "yes" ] || [ $input == "y" ]; then
         # 判斷存放目錄是否存在
         if [ ! -d $big_filesystem/data/$now ]; then
             # 不存在新建目錄
            mkdir -p $big_filesystem/data/$now
         fi
         rsync -aR $1 $big_filesystem/$now/
         rm -rf $1
    #判斷輸入no的情況
    elif [ $input == "no" ] || [ $input == "n"]; then
         exit 0
    else
       # 如果選擇別的輸入符,提示
        echo "只能輸入yes或者no"  
    fi
    
else
     # 判斷磁盤空間不足的情況
     echo "這磁盤沒有足夠的空間備份: $1."
     read -p "你還想刪除"$1"嗎? yes|no :" input
     if [ $input == "yes" ] || [ $input == "n" ]; then
          # body
          echo "$1將會在3秒後刪除,將不會有備份"
          for i in `seq 1 5`; do echo -ne "."; sleep 1; done
          rm -rf $1

     elif [ $input == "no" ] || [ $input == "n" ]; then
          echo "將不會刪除 $1."
          exit 0
     else
          # 如果選擇別的輸入符,提示
           echo "只能輸入yes或者no"  
     fi
     
fi

我的gitee:https://gitee.com/chengfeng99/Linux-DevOps

歡迎和我一起來討論學習

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章