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

