linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做练习:
1. 简单
假设有一个大的分区/data/,每次删除文件或者目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201703271012/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R 把文件路径一同同步
2. 复杂
不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n,则提示未删除,然后退出脚本。
1. 简单
#!/bin/bash
filename=$1
d=`date +%Y%m%d%H%M`
read -p “Are U sure delete the file or directory $1? y|n: ” c
if [ $c == “y” ] || [ $c == “Y” ]
then
mkdir /data/.$d
rsync -aR $1/ /data/.$d/$1/
/bin/rm -rf $1
elif [ $c == “n” ] || [ $c == “N” ]
then
exit 0
else
echo “Please input ‘y’ or ‘n’.”
fi
2. 复杂
#!/bin/bash
filename=$1
d=`date +%Y%m%d%H%M`
f_size=`du -sk $1|awk ‘{print $1}’`
disk_size=`LANG=en; df -k |grep -vi filesystem|awk ‘{print $4}’ |sort -n |tail -n1`
big_filesystem=`LANG=en; df -k |grep -vi filesystem |sort -n -k4 |tail -n1 |awk ‘{print $NF}’`
if [ $f_size -lt $disk_size ]
then
read -p “Are U sure delete the file or directory: $1? y|n: ” c
if [ $c == “y” ] || [ $c == “Y” ]
then
mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/ && /bin/rm -rf $1
elif [ $c == “n” ] || [ $c == “N” ]
then
exit 0
else
echo “Please input ‘y’ or ‘n’.”
fi
else
echo “The disk size is not enough to backup the files $1.”
read -p “Do you want to delete “$1″? y|n: ” c
if [ $c == “y” ] || [ $c == “Y” ]
then
echo “It will delete “$1″ after 5 seconds whitout backup.”
for i in `seq 1 5`; do echo -ne “.”; sleep 1;done
echo
/bin/rm -rf $1
elif [ $c == “n” ] || [ $c == “N” ]
then
echo “It will not delete $1.”
exit 0
else
echo “Please input ‘y’ or ‘n’.”
fi
fi
shell习题-自定义rm
2017年11月28日
shell习题
No Comments
aming
linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做练习:
1. 简单
假设有一个大的分区/data/,每次删除文件或者目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201703271012/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R 把文件路径一同同步
2. 复杂
不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n,则提示未删除,然后退出脚本。
参考答案: