需求背景:
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