linux删除脚本怎么写,Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,...

Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时都要做一个备份,然后再删除。

假设有一个大的分区/data/,每次删除文件或者目录前,都要在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201802021054,然后把所有删除的文件同步到该目录下面,可以使用rsync -R把文件路径一同同步

答案:#!/bin/bash

d=`date +%Y%m%d%H%M`

read -p "Are you sure delete the file or directory $1? y|n:"  c

if [ $c == "y" ] || [ $c == "Y"]

then

mkdir /data/.$d

rsync -aR $1/   /data/.$d

/bin/rm -rf $1

elif [ $c == "n"] || [ $c == "N"]

then

exit 0

else

echo "Please input y or n"

fi

解析:首先声明一个变量$d,将日期命令(date +%Y%m%d%H%M)的执行结果赋值给变量d,这里用到了反引号(``),作用就是将反引号中命令的运行结果反馈出来。使用read -p 将输入结果赋值给变量$c。

使用if进行判断,这里首先说明几个命令的作用,[]中括号里面是判断的条件,两边都要有空格,条件判断符“==”两边也要有空格, ||是或者的意思。那么,整段的含义是:如果$c全等于字符串y或者Y,则执行 mkdir 创建文件夹,执行rsync同步命令,最后执行删除命令。再如果,$c全等于字符串n或者N,则退出,否则(以上两种情况都不包含,输出echo“please input y or n”)。

单独说明 rsync -aR $1/   /data/.$d。其实完整的写法应该是 rsync -aR $1/ /data/.$d/$1,但是这样写,如果$1的值为一个绝对路径,如:/tmp/1.txt,那么代入会发现

rsync -aR /tmp/1.txt  /data/.201802021122//tmp/1.txt。多了一个/会报错,所以省略了/$1,避免这种情况。

答案二:

不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n,则提示未删除,然后退出脚本。#!/bin/bash

d=`date +%Y%m%d%H%M`

##将日期命令的执行结果赋值给变量$d

f_size=`du -sk $1 |awk '{print $1}'`

##du -sk $1 是以kb为单位列出$1的大小总和.结果为 大小  文件名 如:4   1.txt

##所以只打印管道符前命令的结果的第一段,也就是  大小 文件名的第一段,  大小

##将运行结果赋值给变量$f_size

disk_size=`LANG=en; df -k |grep -vi filesystem |awk '{print $4}' |sort -n |tail -n1`

##LANG=en为显示语言为英文,df -k是查看已挂载磁盘的总容量,使用容量,剩余容量

##awk '{print $4}'打印第四段,因df -k 显示的排序为 文件系统(filesystem),块,已用,可用

##sort -n 使用纯数字排序,从小到大

##tail -n1 打印最后一行

##整段代码的含义就是,将最大的可用内存打印出来,赋值给变量disk_size

big_filesystem=`LANG=en; df -k |grep -vi filesystem |sort -n -k4 |tail -n1 |awk '{print $NF}'`

##LANG=en显示语言为英文,df -k 查看已挂载磁盘的总容量,使用容量,剩余容量

##grep -vi 不区分大小写打印不包括 filesystem的行

##tail -n1 打印最后一行

##打印最后一个段,也就是挂载点名称

##h整段代码是将最大可用内存的挂载点名称打印出来,赋值给变量$big_filesystem

if [ $f_size -lt $disk_size]

##判断$f_size的值 是否小于 $disk_size的值,如果小于则执行

then

read -p "Are you sure delete the file or directory:$1? y|n:" c

##将输入的内容赋值给变量$c

if [ $c == "y"] || [ $c == "Y"]

##判断 $c的值是否全等于 y或Y

then

mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/ && /bin/rm -rf $1

##mkdir -p 级联创建目录,最大剩余挂载点/日期,rsync -R是连同目录一同同步,

##整段就是在最大挂载点下创建以日期为名称的文件夹,使用rsync命令一同同步,最后删除$1文件

elif [ $c == "n"] || [ $c == "N"]

##判断变量$c的值是n或N,则退出

then

exit 0

else

echo "please input y or n"

##如果$c的值不等于y,Y,n,N,则输出 please input y or n

fi

else

echo "the disk size is not enough to backup the files $1"

##变量$f_size的值不小于$disk_size的值,则执行下面命令

read -p "Do you want to delete $1? y|n:" c

if [ $c == "y"] || [ $c == "Y"]

##$c=y|Y

then

echo "it will delete $1 after 10 seconds whitout bachup."

##则输出

for i in `seq 1 10`

##for循环,1到10,10次循环

do

echo -ne "="

##echo -ne不换行输出 =

sleep 1

##sleep 1延迟1秒

done

echo

/bin/rm -rf $1

##删除$1文件

elif [ $c == "n"] || [ $c == "N"]

##$c =n|N

then

echo "it will not delete $1"

##则输出 it will not delete。。

exit 0

##退出

else

##以上情况不存在,则输出

echo "Please input y or n"

fi

fi

-------习题来源阿铭Linux--------

以上仅为个人理解,不正之处请指出,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值