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

如何编写/修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:42:31