4

我正在研究亚马逊 s3 存储桶。我需要通过代码找到存储桶内文件夹的大小。我没有找到任何直接查找文件夹大小的方法。那么有没有其他方法可以实现这个功能呢?

编辑:我知道 s3 存储桶中没有任何称为文件夹的东西。但我需要找到看起来像文件夹文件夹结构的所有文件的大小。也就是说,如果结构是这样的,https://s3.amazonaws.com/****/uploads/storeeoll48jipuvjbqufcap3p6on6er2bwsufv5ojzqnbe01xvw0fy58x65.png那么我需要找到所有具有该结构的文件的大小,https://s3.amazonaws.com/****/uploads/...

4

6 回答 6

5

来自 AwsConsoleApp.java AWS 开发工具包示例:

List<Bucket> buckets = s3.listBuckets();
long totalSize  = 0;
int  totalItems = 0;
for (Bucket bucket : buckets)
{
    ObjectListing objects = s3.listObjects(bucket.getName());
    do {
        for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            totalSize += objectSummary.getSize();
            totalItems++;
        }
        objects = s3.listNextBatchOfObjects(objects);
    } while (objects.isTruncated());
    System.out.println("You have " + buckets.size() + " Amazon S3 bucket(s), " +
                    "containing " + totalItems + " objects with a total size of " + totalSize + " bytes.");
}
于 2012-05-21T13:09:01.063 回答
5

如果您想在 python 中使用 boto,这里有一个小脚本,您可以尝试:

import boto
conn=boto.connect_s3('api_key','api_secret')
bucket=conn.get_bucket('bucketname');
keys=bucket.list('path')
size=0
for key in keys:
        size+= key.size
print size
于 2012-05-21T13:23:45.470 回答
0

S3 中没有所谓的“文件夹”,它是一个平面文件系统。文件名(桶键)可能包含斜杠(/),各种桶浏览器可以使用它来解释文件夹文件结构。

要知道 S3 中“文件夹”的大小,您首先必须知道包含该“文件夹”路径的子字符串的所有单个文件的键。如果您的存储桶包含数百万个文件,这将是一项非常昂贵的操作。

一些 S3 浏览器会自动执行此操作。我将 Cloudberry 资源管理器用于 S3。

于 2012-05-21T13:05:26.943 回答
0

S3 中并不真正存在文件夹。

软件将带有 Key 的对象subfolder/myfile.txt显示为在subfolder文件夹中。但它只是一个显示的东西,该文件夹并不存在。如果您想以编程方式找出该“文件夹”中有多少项目,请遍历以子文件夹开头的所有对象/获取它们的大小并将其相加。或者查看S3Browser,它会在右键单击时为您提供大小。

于 2012-05-21T13:05:58.650 回答
0

以下是使用 boto3 的方法:

import boto3

bucketName = '<bucketname>'
client = boto3.client('s3')

def get_all_objects_in_prefix(prefix):
    lastkey = ''
    while True:
        response = client.list_objects(
            Bucket=bucketName,
            Prefix=prefix,
            Marker=lastkey,
            MaxKeys=1000
        )
        if not response.get('Contents'):
            break
        lastkey = [item['Key'] for item in response['Contents']][-1]
        for item in response['Contents']:
            yield item

def get_filesize_of_prefix(prefix):
    size = 0
    for item in get_all_objects_in_prefix(prefix):
        size += item['Size']

    return size
于 2016-11-18T23:47:46.733 回答
0

这是我对 boto3 的处理方式

从存储桶返回目录(键)大小(以 MB 为单位)的函数

s3_client   = client('s3')  
def get_s3_folder_size_mb(bucket,prefix):
    len = 0
    s3_result =  s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for key in s3_result['Contents']:
        len+=key['Size'] 
        while s3_result['IsTruncated']:
            continuation_key = s3_result['NextContinuationToken']
            s3_result = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix, ContinuationToken=continuation_key)
            for key in s3_result['Contents']:
                len+=key['Size']
    return len/1024/1024
于 2018-12-05T11:57:06.283 回答