需求背景:
linux 系統的rm -rf 命令太危險,一步當心就會刪除掉系統文件。寫個shell腳原本替換該命令,要求當刪除一個文件或者目錄時,都要作一個備份,而後再刪除。
下面分兩種狀況作練習:
1 簡單:
假設有一個很大的分區/data/,每次刪除文件或者目錄時,都要先在/data/下面建立一個隱藏目錄,以日期/時間命名,好比/data/201703271012/,而後把全部刪除的文件都同步到該目錄下,可使用rsync -R把文件路徑一塊兒同步。linux
#!/bin/bash filname=$1 big_filesystem=/data/ if [ ! -e $1 ];then echo "$1 不存在,請使用絕對路徑" exit fi d=`date +%F-%T` read -p "你肯定要刪除文件 $1 嗎?y|n:" c case $c in y|Y) mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/ && /bin/rm -rf $1 ;; n|N) exit 0 ;; *) echo "請輸入'y'或者'n'." ;; esac
2 複雜:
不知道哪一個分區有剩餘空間,在刪除以前先計算要刪除的文件或者目錄大小,而後對比系統的磁盤空間,若是夠則按照上面你的規則建立隱藏目錄,並備份,若是沒有足夠空間,要提醒用戶沒有足夠空間備份並提示是否放棄備份,若是用戶選擇y,則直接刪除文件或者目錄,若是選擇n,則提示未刪除,而後退出腳本。shell
分析:該需求主要難點在於計算目錄或者文件大小,還有計算本機剩餘磁盤空間最大的分區大小。兩者咱們都以kb爲單位,用正則找出對應的數值。而後作比較就能夠。bash
f_size=du -sk filename |awk '{print $1}' //文件大小 disk_size=df -k |sed -n '2,$'p |sort -n -k4 |awk '{print $4}' |tail -1 //磁盤剩餘最大空間大小 big_filesystem=df -k |sed -n '2,$'p |sort -n -k4 |tail -1 |awk '{print $NF}' //磁盤最大剩餘空間掛載點
#!/bin/bash filename=$1 if [ ! -e $1 ];then echo "$1 不存在,請使用絕對路徑。" exit fi d=`date +%F-%T` f_size=`du -sk $1 |awk '{print $1}'` disk_size=`df -k |sed -n '2,$'p |sort -n -k4 |awk '{print $4}' |tail -1` big_filesystem=`df -k |sed -n '2,$'p |sort -n -k4 |tail -1 |awk '{print $NF}'` if [ $f_size -lt $disk_size ];then read -p "你肯定要刪除文件 $1 嗎?y|n:" c case $c in y|Y) mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/ && /bin/rm -rf $1 ;; n|N) exit 0 ;; *) echo "請輸入'y'或者'n'." ;; esac else echo "空間不足,沒法備份文件$1" read -p "你肯定要刪除文件 $1 嗎?y|n:" c case $c in y|Y) echo "將會在5秒中以後進行無備份刪除文件" for i in `seq 1 5`;do echo -ne ".";sleep 1;done echo /bin/rm -rf $1 ;; n|N) echo 「刪除取消」 exit 0 ;; *) echo "請輸入'y'或者'n'." ;; esac fi