基于YYYY-MM-DD格式目录名称清理旧备份目录的优化方案咨询
基于YYYY-MM-DD格式目录名称清理旧备份目录的优化方案咨询
Hey Jeremy,这个问题我太有共鸣了!之前也遇到过类似的情况——用find基于修改时间清理备份目录,结果因为rsync硬链接的操作(删除链接会更新目录的mtime),导致最后目录删不掉,实在头疼。既然你的备份目录都是标准的YYYY-MM-DD命名,直接基于目录名称来筛选肯定是更靠谱的解决方案,完全避开修改时间的坑!
具体实现思路
核心思路是:先计算出60天前的日期阈值,然后遍历所有备份目录,跳过每月1号的目录,再判断剩余目录的名称日期是否早于阈值,符合条件就删除。
下面是可以直接用的bash脚本:
# 计算60天前的日期,格式为YYYY-MM-DD THRESHOLD=$(date -d "-60 days" +%Y-%m-%d) # 遍历所有二级目录下的YYYY-MM-DD格式目录 for dir in /backups/stores/*/????-??-??/; do # 提取纯目录名称(去掉路径部分) dir_date=$(basename "$dir") # 跳过每月1号的备份目录 if [[ "$dir_date" =~ ^[0-9]{4}-[0-9]{2}-01$ ]]; then continue fi # 比较目录日期和阈值日期(YYYY-MM-DD格式字符串可直接按字典序比较) if [[ "$dir_date" < "$THRESHOLD" ]]; then # 先打印要删除的目录,确认无误后可去掉echo直接执行rm echo "准备删除旧备份目录: $dir" # rm -rf "$dir" fi done
关键细节说明
- 日期比较逻辑:因为
YYYY-MM-DD格式的字符串按字典序排序和实际日期顺序完全一致,所以直接用<就能判断目录日期是否早于阈值日期,不需要复杂的时间戳转换。 - 跳过每月1号:用正则表达式
^[0-9]{4}-[0-9]{2}-01$精准匹配所有每月1号的目录,确保这些目录被保留。 - 安全预览:脚本里先保留
echo打印操作,建议你先运行一遍,确认要删除的目录都是符合预期的,没问题再把rm -rf "$dir"前面的注释去掉,正式执行删除。
兼容性补充
如果你的系统是BSD系(比如macOS),date命令的参数会略有不同,计算60天前日期的命令需要改成:
THRESHOLD=$(date -v -60d +%Y-%m-%d)
备注:内容来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

