如何配置Python按时间规则清理旧发布文件?
问题描述
我有如下发布文件命名结构:release-*<year>_<month>_<build>*,示例文件如下:
release-v22_06_06.zip release-v22_06_06 release-changelog-v22_06_06.txt
需要用Python实现以下文件清理规则:
- 保留当月及上月的所有文件
- 保留3-4个月前的最新构建文件,删除该月的其他构建文件(若存在)
- 删除5个月及更早的所有发布文件
我已编写了初始代码,但不知道如何匹配文件名中的月份,也不清楚如何对月份进行减法操作,初始代码如下:
#!/usr/bin/env python3 import glob from datetime import datetime release_files = glob.glob("/tmp/release*") month = datetime.now().date().month for item in release_files: file_month = item.split("_") if '8' in file_month[1]: print(item)
解决方案
1. 核心思路
- 用正则表达式可靠提取文件名中的年份、月份、构建号,避免字符串分割的局限性
- 转换为日期对象计算月份差,自动处理跨年场景(比如1月减1对应去年12月)
- 按年月分组文件,针对不同时间段应用对应清理规则
2. 完整实现代码
#!/usr/bin/env python3 import glob import re import os from datetime import datetime from collections import defaultdict def parse_release_file(filename): """解析文件名,返回(年份, 月份, 构建号),解析失败返回None""" pattern = re.compile(r'release-.+?(\d{2})_(\d{2})_(\d+).*') match = pattern.search(filename) if not match: return None # 转换为4位年份(默认20xx年,可根据实际调整) year = 2000 + int(match.group(1)) month = int(match.group(2)) build = int(match.group(3)) return (year, month, build) def get_month_diff(current_date, file_year, file_month): """计算文件所在月份与当前月份的差值(当前 - 文件,正数表示文件是过去的月份)""" file_date = datetime(file_year, file_month, 1).date() return (current_date.year - file_date.year) * 12 + (current_date.month - file_date.month) def main(): current_date = datetime.now().date() release_files = glob.glob("/tmp/release*") # 按(年,月)分组存储文件及对应构建号 files_by_month = defaultdict(list) invalid_files = [] # 第一步:分组文件 for file_path in release_files: parsed = parse_release_file(file_path) if not parsed: invalid_files.append(file_path) continue year, month, build = parsed files_by_month[(year, month)].append( (build, file_path) ) # 输出无法解析的文件(可根据需求选择删除或保留) if invalid_files: print(f"无法解析的文件:{invalid_files}") # 第二步:按规则处理各月份文件 for (year, month), files in files_by_month.items(): month_diff = get_month_diff(current_date, year, month) # 规则1:保留当月(差值0)或上月(差值1)的所有文件 if month_diff in (0, 1): print(f"保留[{year}-{month}]的所有文件:{[f[1] for f in files]}") continue # 规则2:3-4个月前的文件,仅保留最新构建版 elif month_diff in (3, 4): # 按构建号降序排序,取第一个为最新版 sorted_files = sorted(files, key=lambda x: x[0], reverse=True) keep_file = sorted_files[0][1] delete_files = [f[1] for f in sorted_files[1:]] print(f"保留[{year}-{month}]的最新构建文件:{keep_file}") for f in delete_files: print(f"待删除文件:{f}") # os.remove(f) # 取消注释执行实际删除操作 # 规则3:删除5个月及更早的所有文件 elif month_diff >= 5: print(f"删除[{year}-{month}]的所有文件:{[f[1] for f in files]}") for _, f in files: print(f"待删除文件:{f}") # os.remove(f) # 取消注释执行实际删除操作 if __name__ == "__main__": main()
代码说明
- 文件名解析:正则表达式适配不同前缀的文件名,稳定提取年月和构建号
- 月份差计算:通过日期对象计算,自动处理跨年场景,避免直接数字加减的错误
- 安全机制:默认仅打印操作,确认逻辑正确后再取消
os.remove的注释执行实际删除
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

