如何编写/修复Python脚本以删除S3存储桶中指定前缀对象的所有版本(含删除标记)
解决S3版本控制下删除指定前缀所有对象版本的问题
嘿,我懂你遇到的麻烦!你之前用AWS CLI命令:
aws s3 rm s3://bucket/folder/ --recursive --exclude "*" --include "file_prefix*"
在启用版本控制的S3桶里确实只会给对象加删除标记,不会彻底删掉所有版本。而你写的Python脚本问题出在只做精确文件名匹配(x["Key"] == filename),没法匹配前缀对应的所有对象,所以达不到预期效果。
下面是修改后的脚本,能实现前缀匹配,并且彻底删除所有符合规则的对象版本和删除标记:
import boto3 from fnmatch import fnmatch bucket_name = "my-bucket" prefix_pattern = "folder/file_prefix*" # 和你CLI里的匹配规则保持一致 s3_client = boto3.client("s3") paginator = s3_client.get_paginator("list_object_versions") # 分页遍历桶内所有对象版本和删除标记 for response in paginator.paginate(Bucket=bucket_name): # 合并版本对象和删除标记列表 all_objects = response.get("Versions", []) all_objects.extend(response.get("DeleteMarkers", [])) # 筛选出符合前缀规则的对象 for obj in all_objects: obj_key = obj["Key"] # 用fnmatch实现和CLI一致的通配符匹配逻辑 if fnmatch(obj_key, prefix_pattern) and obj["VersionId"] != "null": print(f"Deleting object: {obj_key} | Version ID: {obj['VersionId']}") s3_client.delete_object( Bucket=bucket_name, Key=obj_key, VersionId=obj["VersionId"] )
核心改动点:
- 引入
fnmatch模块:这是Python标准库的一部分,能实现和AWS CLI完全一致的通配符匹配,让folder/file_prefix*真正匹配所有以该前缀开头的对象,而不是精确匹配单个文件。 - 替换精确匹配为前缀匹配:把原来的
x["Key"] == filename改成fnmatch(obj_key, prefix_pattern),这样就能命中所有符合规则的对象了。 - 代码可读性优化:调整了变量命名和遍历逻辑,让代码更清晰易懂。
几点注意事项:
- 确保你的AWS身份凭证拥有
s3:DeleteObject和s3:ListBucketVersions权限,否则脚本会抛出权限错误。 - 如果桶里对象数量很多,分页器会自动处理,不用担心内存溢出问题。
- 建议先注释掉
delete_object这一行,只运行打印逻辑,确认要删除的对象范围无误后,再真正执行删除操作,避免误删!
内容的提问来源于stack exchange,提问作者Some Java Guy
相关产品推荐
相关产品推荐

