![删除不属于 bash 数组的文件](https://linux22.com/image/65794/%E5%88%A0%E9%99%A4%E4%B8%8D%E5%B1%9E%E4%BA%8E%20bash%20%E6%95%B0%E7%BB%84%E7%9A%84%E6%96%87%E4%BB%B6.png)
现在我每天使用 cronjob 备份 mysql 数据库。现在服务器已经满了,我只想保留每个月的一个备份,每周日的一个备份以及最近的7个备份。
我的备份文件如下所示(在目录中/var/backup
):
full_2015-05-16-061115.sql.gz.enc
full_2015-05-17-061117.sql.gz.enc
...
这个服务器故障帖子:https://serverfault.com/a/643335/274380 帮助我创建 shell 脚本以及如何确定正确的日期并将它们放入数组中。
我对上面帖子的脚本做了一些修改,如下:
for i in {0..7};
do
index=$(date +"%Y%m%d" -d "-$i day");
value=$(date +"%Y-%m-%d" -d "-$i day");
keep[index]=$value;
done;
for i in {0..4};
do
index=$(date +"%Y%m%d" -d "sunday-$((i+1)) week");
value=$(date +"%Y-%m-%d" -d "sunday-$((i+1)) week");
keep[index]=$value;
done
for i in {0..12};
do
DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
index=$(date +"%Y%m%d" -d "sunday-$DW weeks");
value=$(date +"%Y-%m-%d" -d "sunday-$DW weeks");
keep[index]=$value;
done
echo ${keep[@]};
输出是:
2014-05-04 2014-06-01 2014-07-06 2014-08-03 2014-09-07 2014-10-05 2014-11-02 2014-12-07 2015-01-04 2015-02-01 2015-03-01 2015-04-05 2015-04-26 2015-05-03 2015-05-10 2015-05-17 2015-05-20 2015-05-21 2015-05-22 2015-05-23 2015-05-24 2015-05-25 2015-05-26 2015-05-27
所以我的问题是,基于${keep[@]}
如何保留日期所在的文件${keep[@]}
并删除其余的文件?
先感谢您!
答案1
我就是这样做的:
find /var/backup/ -type f -maxdetph 1 $(printf "! -name %s " ${keep[*]}) \
-exec rm {} \;
请注意,如果您的文件名中包含空格,则此操作将不起作用。
答案2
grep -vE
与以下表达式一起使用如何:
$ echo "$(IFS=\| && echo "${keep[*]}")"
2014-05-04|2014-06-01|2014-07-06|2014-08-03|2014-09-07|2014-10-05|2014-11-02|2014-12-07|2015-01-04|2015-02-01|2015-03-01|2015-04-05|2015-04-26|2015-05-03|2015-05-10|2015-05-17|2015-05-20|2015-05-21|2015-05-22|2015-05-23|2015-05-24|2015-05-25|2015-05-26|2015-05-27
所以你可以这样做:
ls /var/backup/* | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm
更新:如果您更喜欢使用查找:
find /var/backup -maxdepth 1 -type f | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm
或者更复杂的一种:
find /var/backup -maxdepth 1 -type f -regextype posix-egrep ! -regex ".*($(IFS=\| && echo "${keep[*]}")).*" -print0 | xargs -0r rm