每天晚上我的服务器都会为每个mysql数据库创建备份。所有这些文件都保存在/ backup / mysql / 2014-11-28这样的文件夹中。在过去的几个月里,很多文件夹和文件都存储在该目录中,我想减少这个。
因此我需要一个bash脚本来删除给定目录中的每个文件夹,除了本月创建的每个文件夹(不是最近30天,而是实际月份),每周除了一个备份(例如备份)从星期日)。由于我不知道如何进行星期日派对,我认为从第7天,第14天,第21天和第28天保留备份会更简单。
#!/bin/bash
in_array() {
local haystack=${1}[@]
local needle=${2}
for i in ${!haystack}; do
if [[ ${i} == ${needle} ]]; then
return 0
fi
done
return 1
}
YEAR=`date +%Y`
LASTYEAR=`date +%Y -d "1 year ago"`
MONTH=`date +%m`
DAYS="07 14 21 28"
for i in $( ls ); do
BACKUP_YEAR=$(echo "${i}" | cut -d'-' -f1)
BACKUP_MONTH=$(echo "${i}" | cut -d'-' -f2)
BACKUP_DAY=$(echo "${i}" | cut -d'-' -f3)
DELETE=false
if [[ "$BACKUP_YEAR" == "$YEAR" ]]; then
if [[ "$BACKUP_MONTH" != "$MONTH" ]]; then
if [ $(in_array $DAYS "$BACKUP_DAY") ]; then
DELETE=true
fi
fi
fi
if [[ "$BACKUP_YEAR" == "$LASTYEAR" ]]; then
if [[ "$BACKUP_DAY" != ${DAYS[0]} ]]; then
DELETE=true
fi
fi
if [ "$DELETE" = true ] ; then
#OUTPUT=`rm -v -R $i`
echo $i
fi
done
第二部分(来自前一年的备份)完全正常,但第一部分(今年备份)不起作用,我不知道为什么。我在这个网站上找到了这个功能,不过我觉得我的电话错了。
编辑:我现在使用的代码:
#!/bin/bash
read YEAR MONTH <<<$(date "+%Y %m")
LASTYEAR=$(( YEAR-1 ))
DAYS=" 07 14 21 28 "
for fn in $( ls )
do
if ([ "${fn:0:4}" = "$YEAR" ] &&
[ "${fn:5:2}" != "$MONTH" ] &&
[ "${DAYS/ ${fn:8:2} /}" = "$DAYS" ]) || ([ "${fn:0:4}" = "$LASTYEAR" ] &&
[ "${fn:8:2}" != ${DAYS:1:2} ])
then
#OUTPUT=`rm -v -R $fn`
echo "$fn"
fi
done
答案 0 :(得分:0)
#!/bin/bash
read YEAR MONTH <<<$(date "+%Y %m")
LASTYEAR=$(( YEAR-1 ))
DAYS=" 07 14 21 28 "
for fn in $( ls )
do
DELETE=false
if [ "${fn:0:7}" = "$YEAR-$MONTH" ] &&
[ "${DAYS/ ${fn:8:2} /}" != "$DAYS" ]
then
DELETE=true
elif [ "${fn:0:4}" = "$LASTYEAR" ] &&
[ "${fn:8:2}" != ${DAYS:1:2} ]
then
DELETE=true
fi
if [ "$DELETE" = true ]
then
#OUTPUT=`rm -v -R $fn`
echo "$fn"
fi
done
假设文件名与以下日期格式YYYY-MM-DD
匹配,例如2014-03-27
,则表达式${fn:0:7}
将为2014-03
; ${fn:8:2}
将为27
; ${fn:0:4}
将是2014
。
阅读有关parameter expansion。
的bash手册页表达式${DAYS/ ${fn:8:2} /}
检查文件名中的日期(由空格包裹),可在DAYS
列表中找到。它等同于echo "${DAYS}" | grep -q "${BACKUP_DAY}"
。
注意:可以通过for
减少if
循环内的命令(加入elif
和||
,并删除DELETE
变量检查和DELETE
变量本身)但我决定保留原始脚本的外观。