如何删除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
相关产品推荐
相关产品推荐

