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

如何删除Amazon S3存储桶指定文件夹下特定格式文件的所有版本

S3批量通配符匹配删除多版本对象修改方案

核心修改逻辑

S3原生API不直接支持通配符查询,所以需要结合前缀过滤 + 本地通配符匹配实现需求,修改点如下:

  • 引入Python标准库fnmatch实现通配符规则匹配
  • 给分页查询接口增加Prefix参数,提前过滤目标文件夹下的对象,避免全桶扫描,大幅减少无效数据拉取
  • 将原代码的Key精确匹配逻辑替换为通配符匹配
  • 可选优化:使用delete_objects批量删除接口替代单对象删除,数千文件场景下可减少99%的API调用次数,效率提升明显

修改后完整代码

import boto3
import fnmatch

bucket = "my-bucket-name"
# 通配符匹配规则,支持*、?等标准通配符语法
filename_pattern = "my-folder/*.xml"
# 自动提取通配符前的固定前缀,用于API端提前过滤
prefix = filename_pattern.split("*")[0]

client = boto3.client("s3")
paginator = client.get_paginator("list_object_versions")
# 增加Prefix参数减少拉取范围
response_iterator = paginator.paginate(Bucket=bucket, Prefix=prefix)

for response in response_iterator:
    # 合并普通版本和删除标记
    versions = response.get("Versions", [])
    versions.extend(response.get("DeleteMarkers", []))
    # 通配符匹配过滤目标对象
    target_objects = [
        {"Key": x["Key"], "VersionId": x["VersionId"]}
        for x in versions
        if fnmatch.fnmatch(x["Key"], filename_pattern) and x["VersionId"] != "null"
    ]
    if not target_objects:
        continue
    # 批量删除,单次最多支持1000个对象
    delete_resp = client.delete_objects(
        Bucket=bucket,
        Delete={"Objects": target_objects, "Quiet": True}
    )
    # 打印删除结果
    for obj in target_objects:
        print(f"已删除对象 {obj['Key']} 版本 {obj['VersionId']}")

注意事项

  • 执行前建议先把delete_objects调用注释掉,打印target_objects列表确认匹配的对象符合预期,避免误删
  • 如果存储桶开启了MFA删除功能,需要额外在delete_objects参数中传入MFA校验信息
  • 通配符语法支持标准Unix shell风格匹配规则,*匹配任意长度任意字符,?匹配单个任意字符,[]匹配指定范围内的字符

内容的提问来源于stack exchange,提问作者Some Java Guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:51:00