1. 程式人生 > >Linux學習總結(六十七)rm命令限制腳本

Linux學習總結(六十七)rm命令限制腳本

files 空間大小 inux sync sys sed -n sed bash 進行

需求背景:
linux 系統的rm -rf 命令太危險,一步小心就會刪除掉系統文件。寫個shell腳本來替換該命令,要求當刪除一個文件或者目錄時,都要做一個備份,然後再刪除。
下面分兩種情況做練習:
1 簡單:
假設有一個很大的分區/data/,每次刪除文件或者目錄時,都要先在/data/下面創建一個隱藏目錄,以日期/時間命名,比如/data/201703271012/,然後把所有刪除的文件都同步到該目錄下,可以使用rsync -R把文件路徑一起同步。

#!/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,則提示未刪除,然後退出腳本。

分析:該需求主要難點在於計算目錄或者文件大小,還有計算本機剩余磁盤空間最大的分區大小。二者我們都以kb為單位,用正則找出對應的數值。然後做比較就可以。

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)
    ;;
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

Linux學習總結(六十七)rm命令限制腳本