You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:48:25