首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Go SDK 2获取Amazon中文件夹的大小

使用Go SDK 2获取Amazon中文件夹的大小
EN

Stack Overflow用户
提问于 2021-09-19 08:21:29
回答 3查看 671关注 0票数 1

我知道亚马逊S3中没有文件夹,但是我们可以通过在密钥名上使用"/“来模仿它们。既然如此,是否可以使用用于Go v2的来计算文件夹的大小?还是必须检索文件夹中的所有对象,然后逐个计算大小?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-19 09:30:06

给定那个例子,以及对象类型文档这里

计算桶内物品占用的大小是可能的。

代码语言:javascript
复制
package main

import (
    "context"
    "flag"
    "fmt"
    "log"

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

var (
    bucketName      string
    objectPrefix    string
    objectDelimiter string
    maxKeys         int
)

func init() {
    flag.StringVar(&bucketName, "bucket", "", "The `name` of the S3 bucket to list objects from.")
    flag.StringVar(&objectPrefix, "prefix", "", "The optional `object prefix` of the S3 Object keys to list.")
    flag.StringVar(&objectDelimiter, "delimiter", "",
        "The optional `object key delimiter` used by S3 List objects to group object keys.")
    flag.IntVar(&maxKeys, "max-keys", 0,
        "The maximum number of `keys per page` to retrieve at once.")
}

// Lists all objects in a bucket using pagination
func main() {
    flag.Parse()
    if len(bucketName) == 0 {
        flag.PrintDefaults()
        log.Fatalf("invalid parameters, bucket name required")
    }

    // Load the SDK's configuration from environment and shared config, and
    // create the client with this.
    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
        log.Fatalf("failed to load SDK configuration, %v", err)
    }

    client := s3.NewFromConfig(cfg)

    // Set the parameters based on the CLI flag inputs.
    params := &s3.ListObjectsV2Input{
        Bucket: &bucketName,
    }
    if len(objectPrefix) != 0 {
        params.Prefix = &objectPrefix
    }
    if len(objectDelimiter) != 0 {
        params.Delimiter = &objectDelimiter
    }

    // Create the Paginator for the ListObjectsV2 operation.
    p := s3.NewListObjectsV2Paginator(client, params, func(o *s3.ListObjectsV2PaginatorOptions) {
        if v := int32(maxKeys); v != 0 {
            o.Limit = v
        }
    })

    // Iterate through the S3 object pages, printing each object returned.
    var i int
    var total int64
    log.Println("Objects:")
    for p.HasMorePages() {
        i++

        // Next Page takes a new context for each page retrieval. This is where
        // you could add timeouts or deadlines.
        page, err := p.NextPage(context.TODO())
        if err != nil {
            log.Fatalf("failed to get page %v, %v", i, err)
        }

        // Log the objects found
        for _, obj := range page.Contents {
            // fmt.Println("Object:", *obj.Key)
            total += obj.Size
        }
    }
    fmt.Println("total", total)
}

然后,如果我正确地阅读了s3.ListObjectsV2Input文档,在我看来,您可以配置s3.ListObjectV2Input实例的Prefix成员来选择特定的文件夹。该示例已经演示了如果传入标志-prefix=...

票数 4
EN

Stack Overflow用户

发布于 2021-09-19 09:09:50

不确定是否是最简单的方法,但是,您可以迭代您的对象list of interest - ListObjectsV2.html,并在本地聚合大小。

票数 1
EN

Stack Overflow用户

发布于 2022-03-31 09:54:09

另一种方式是:

  • 为水桶启用AWS storage lens - advanced metric - prefix aggregation,并将度量作为csv输出到桶中。
  • 从桶中的文件中获取csv数据

注:度量每24小时输出一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69241548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档