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

如何用Golang递归删除S3存储桶指定子文件夹内的文件?

使用Golang递归删除S3指定子文件夹下的所有文件

我的S3存储桶目录结构如下:

s3://test/my-folder/test1.txt
s3://test/my-folder/test2.txt
s3://test/test3.txt

我需要用Golang实现和s3cmd --recursive s3://test/my-folder/相同的效果——递归删除my-folder下的所有文件,但保留s3://test/test3.txt。

实现思路

S3本身没有真正的文件夹概念,所谓的"文件夹"只是对象键的前缀。因此核心逻辑是:

  • 列出存储桶中所有以my-folder/为前缀的对象
  • 批量删除这些对象,完全规避根目录下的test3.txt

具体实现步骤

1. 安装依赖

确保已安装AWS SDK for Go v2的核心包:

go get github.com/aws/aws-sdk-go-v2/aws
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/s3

2. 完整代码实现

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/s3/types"
)

func main() {
	// 配置参数
	bucketName := "test"
	targetPrefix := "my-folder/" // 末尾斜杠是关键,确保只匹配该前缀下的对象

	// 加载AWS配置(自动从环境变量、~/.aws/credentials等读取)
	cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("your-region"))
	if err != nil {
		log.Fatalf("加载AWS配置失败: %v", err)
	}

	// 创建S3客户端
	s3Client := s3.NewFromConfig(cfg)

	// 第一步:遍历列出所有目标前缀下的对象
	var objectsToDelete []types.ObjectIdentifier
	paginator := s3.NewListObjectsV2Paginator(s3Client, &s3.ListObjectsV2Input{
		Bucket: aws.String(bucketName),
		Prefix: aws.String(targetPrefix),
	})

	for paginator.HasMorePages() {
		page, err := paginator.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("列出S3对象失败: %v", err)
		}

		for _, obj := range page.Contents {
			objectsToDelete = append(objectsToDelete, types.ObjectIdentifier{Key: obj.Key})
		}
	}

	if len(objectsToDelete) == 0 {
		fmt.Println("目标路径下没有需要删除的对象")
		return
	}

	// 第二步:批量删除对象(S3单次最多删1000个,需分块处理)
	const batchSize = 1000
	for i := 0; i < len(objectsToDelete); i += batchSize {
		end := i + batchSize
		if end > len(objectsToDelete) {
			end = len(objectsToDelete)
		}
		batch := objectsToDelete[i:end]

		_, err := s3Client.DeleteObjects(context.TODO(), &s3.DeleteObjectsInput{
			Bucket: aws.String(bucketName),
			Delete: &types.Delete{
				Objects: batch,
				Quiet:   aws.Bool(true), // 静默模式,减少响应输出
			},
		})

		if err != nil {
			log.Fatalf("删除对象批次失败: %v", err)
		}
	}

	fmt.Printf("成功删除%d个对象\n", len(objectsToDelete))
}

关键注意事项

  • 前缀的斜杠:必须给targetPrefix加上末尾斜杠(my-folder/),否则会匹配到所有以my-folder开头的对象(比如my-folder-test.txt),确保只删除目标"文件夹"下的内容。
  • 分页处理:当目标前缀下的对象超过1000个时,ListObjectsV2会分页返回,因此必须用分页器遍历所有结果,避免遗漏。
  • 批量删除限制:S3的DeleteObjects接口单次最多支持删除1000个对象,代码中做了分块处理,保证对象数量超过限制时也能全部删除。
  • 权限要求:运行代码的AWS账号需要拥有该存储桶的s3:ListBucket(列出对象)和s3:DeleteObject(删除对象)权限。

内容的提问来源于stack exchange,提问作者mona moghadampanah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:20:40