簡體   English   中英

如何查找 S3 存儲桶內文件夾的大小?

[英]How to find size of a folder inside an S3 bucket?

我在 python 中使用 boto3 模塊與 S3 交互,目前我能夠獲得 S3 存儲桶中每個單獨密鑰的大小。 但是我的動機是只找到頂級文件夾的空間存儲(每個文件夾都是不同的項目),我們需要按項目對使用的空間進行收費。 我能夠獲得頂級文件夾的名稱,但無法獲得有關以下實現中文件夾大小的任何詳細信息。 以下是我獲取頂級文件夾名稱的實現。

import boto
import boto.s3.connection

AWS_ACCESS_KEY_ID = "access_id"
AWS_SECRET_ACCESS_KEY = "secret_access_key"
Bucketname = 'Bucket-name' 

conn = boto.s3.connect_to_region('ap-south-1',
   aws_access_key_id=AWS_ACCESS_KEY_ID,
   aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
   is_secure=True, # uncomment if you are not using ssl
   calling_format = boto.s3.connection.OrdinaryCallingFormat(),
   )

bucket = conn.get_bucket('bucket')
folders = bucket.list("", "/")

for folder in folders:
    print(folder.name)

這里的文件夾類型是 boto.s3.prefix.Prefix 並且它不顯示任何大小的詳細信息。 有沒有辦法通過名稱搜索 S3 存儲桶中的文件夾/對象,然后獲取該對象的大小?

為了獲取 S3 文件夾的大小, 對象(可在 boto3.resource('s3').Bucket 中訪問)提供了方法filter(Prefix) ,該方法允許您檢索符合 Prefix 條件的文件,並使它相當優化。

import boto3

def get_size(bucket, path):
    s3 = boto3.resource('s3')
    my_bucket = s3.Bucket(bucket)
    total_size = 0

    for obj in my_bucket.objects.filter(Prefix=path):
        total_size = total_size + obj.size

    return total_size

因此,假設您想獲取文件夾s3://my-bucket/my/path/的大小,那么您可以像這樣調用前一個函數:

get_size("my-bucket", "my/path/")

那么這當然也很容易適用於頂級文件夾

要在 S3 中查找頂級“文件夾”的大小(S3 並沒有真正的文件夾概念,但在 UI 中顯示文件夾結構),可以使用以下方法:

from boto3 import client
conn = client('s3')

top_level_folders = dict()

for key in conn.list_objects(Bucket='kitsune-buildtest-production')['Contents']:

    folder = key['Key'].split('/')[0]
    print("Key %s in folder %s. %d bytes" % (key['Key'], folder, key['Size']))

    if folder in top_level_folders:
        top_level_folders[folder] += key['Size']
    else:
        top_level_folders[folder] = key['Size']


for folder, size in top_level_folders.items():
    print("Folder: %s, size: %d" % (folder, size))

不使用 boto3,只使用 aws cli,但是這個快速的單行代碼可以達到目的。 我通常放一個 tail -1 來僅獲取摘要文件夾大小。 但是,對於具有許多對象的文件夾,可能會有點慢。

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/folder-name | 尾-1

要使用 list_objects_v2 從 S3 獲取 1000 多個對象,請嘗試此操作

from boto3 import client
conn = client('s3')

top_level_folders = dict()

paginator = conn.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket='bucket', Prefix='prefix')
index = 1
for page in pages:
    for key in page['Contents']:
        print(key['Size'])
        folder = key['Key'].split('/')[index]
        print("Key %s in folder %s. %d bytes" % (key['Key'], folder, key['Size']))

        if folder in top_level_folders:
            top_level_folders[folder] += key['Size']
        else:
            top_level_folders[folder] = key['Size']

for folder, size in top_level_folders.items():
    size_in_gb = size/(1024*1024*1024)
    print("Folder: %s, size: %.2f GB" % (folder, size_in_gb))

如果前綴是 notes/ 並且分隔符是斜線 (/),如在 notes/summer/july 中,則公共前綴是 notes/summer/。 Incase 前綴是 "notes/" : index = 1 或 "notes/summer/" : index = 2

def find_size(name, conn):
  for bucket in conn.get_all_buckets():
    if name == bucket.name:
      total_bytes = 0
      for key in bucket:
        total_bytes += key.size
        total_bytes = total_bytes/1024/1024/1024
      print total_bytes 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM