用shell压缩三个月及之前的文件(文件名含日期)
在log目录下有如下文件:
?
特征很明显:中间有8位连续数字表示年月日
比如现在是2011年5月份,压缩3个月及之前的就是XXXXXXX.201102XX.log的文件
程序思路:
先用date命令加参数得出今天之前三个月的年月,比如今天是2011年5月19号,用下面这句得到201102:
date -d "3 months ago" +%Y%m
?然后用ls命令将log目录下的文件名列出来赋给数组,在循环中用正则匹配出文件名中的日期:
.*\([0-9]\{8\}\).*?这条正则的相关文档:expr正则匹配心得1
对文件名列表数组循环,在循环中检查到匹配的则给文件名左边添加“log/”,不匹配则置为空串,注意是空串不是空;
然后检查最终数组是否有可用元素,如果没有则打印提示信息,有则执行tar命令;
最后删除已使用过的文件
?
echo "Please wait..."m=`date -d "3 months ago" +%Y%m`index=0f=`ls log -1 -c`for name in $fdo n=`expr "$name" : '.*\([0-9]\{8\}\).*'` if [ "$n" != "" ] && [ "$n" -le "$m"31 ] then f[$index]="log/$name" else f[$index]="" fi (( index ++ ))donestr=${f[@]}if [ "${#str}" -gt 0 ]then tar -zcvf logbak/$m.tar.gz $strelse echo "No files found." exit 0fiecho "tar.gz maked, now delete old files."rm -fr $strecho "done."exit 0?
?