自己的ECS上挂了一些备份数据库、日志、配置文件、/var/www目录等备份脚本,时间一长备份目录下的东西就多了。今天闲下来写个脚本自己批量删除下(别跟我说怎么不在备份脚本里加删除操作的,就是任性)
一言不合上代码
#!/bin/bash DIR="BACKDIR/"#删除文件所在目录,后接/ PATTERN="^MySQL-[0-9]{4}(-[0-9]{2}){2}.sql$"#文件正则匹配模式 DAYS=10#过期时间 PREFIX="-"#日期的前缀 SUFFIX=".sql"#后缀 for FILE in $DIR*;do NAME=${FILE#*$DIR}#去除路径得到文件名 if [[ $NAME =~ $PATTERN ]] && test -f $FILE;then TMP=${NAME#*$PREFIX} DATE=${TMP%$SUFFIX*}#根据前后缀截取日期 #计算过期文件 if test $(( `date +%s`-`date +%s -d $DATE` )) -ge $[DAYS*24*60*60];then echo "Delete expired file:$FILE" rm $FILE#删除 fi fi done
例如:需要删除目录DIR为/home/root/backup/下,格式为MySQL-2017-07-21.sql的数据库备份文件。则需要正则为^MySQL-[0-9]{4}(-[0-9]{2}){2}.sql$(其实要写严谨的话老长了)。截取日期的前缀–即在日期前的一个或多个字符(),同理后缀也一样,如上代码中的。
只是练练手,查缺补漏。(菜鸟一枚,shell平时不怎么练手,一到写脚本各种查资料)下面是知识点总结:
1、${NAME#PREFIX}的作用是截取从左开始PREFIX第一次出现后位置的字符串,如URL=”http://www.baidu.com";${URL#//} 则是”www.baidu.com"。所以若Docker-ghost-2017-07-24.log这样的截取日期的话,采用PREFIX为 - 的话则会截取到错误的ghost-,此时可加长PREFIX为ghost-或t-
2、同上很相似,${NAME%SUFFIX}的作用是截取从右开始SUFFIX第一次出现前位置的字符串,如URL=”http://www.baidu.com";${URL%//} 则是”http”。然后需要注意的也同上理推。
3、简单又实用一点 。for FILE in /home/root/* 或 ls /home/root
,这样可以遍历目录下的文件和目录,再通过 if test -f $FILE 判断是否为文件。
4、if [[ ]]其实也是一种判断方法 ,和if [ ]容易混淆。但是if [[ ]]中[[ 是shell的关键字,在bash、ksh等支持,且能够防止脚本中的许多逻辑错误。在其中可以使用 =~进行正则匹配,也可以使用在if [ ]中不能使用&&、||、>=等。这里搬来一张图做对比:
5、时间差计算:date +%s获取当前时间戳,date +%s -d $DATE 获取给点日期时间戳。相减就是相差的时间,单位为秒。此外date 命令功能很强大,出了给出时间戳和给出格式化时间 date %Y-%m-%d 外,也可以获得上一或多天、上礼拜X、多天前、多个星期前、上个月等等。
6、另外不得不说的就是在shell中${ }、$[ ] 、$(( ))、 $( ) 的使用区别,[[ ]]、 [ ]、 ( )、(( ))、{ }的使用区别。有时候也是蛮让人容易混淆的。需要额外提的两个是 ${ }:用来应直接变量也包括环境变量等(当然我们上面的截取其实也是引用过程的处理);$[ ]:可用来做基本的数值运算。
详尽的资料可以查阅这两篇博文:
[shell中if条件字符串、数字比对,[[ ]]和[ ]区别](http://www.cnblogs.com/include/archive/2011/12/09/2307905.html)