2012-05-21 112 views
4

我正在亞馬遜s3桶上工作。我需要通過代碼找到桶內文件夾的大小。我沒有找到任何方法直接找到文件夾的大小。那麼有沒有其他的方法來實現這個功能?s3桶中的文件夾大小

編輯:我知道s3桶中沒有任何文件夾被稱爲文件夾。但我需要找到所有文件的大小看起來像一個文件夾文件夾結構。也就是說,如果結構是這樣的,https://s3.amazonaws.com/****/uploads/storeeoll48jipuvjbqufcap3p6on6er2bwsufv5ojzqnbe01xvw0fy58x65.png然後我需要找到所有文件的大小與結構,https://s3.amazonaws.com/****/uploads/...

+0

你的意思是文件夾內容的大小? – reach4thelasers

+0

是的。文件夾和子文件夾中所有文件的內容大小。 – Stranger

+0

以編程方式(哪種語言?)或使用工具(哪種工具?)? – reach4thelasers

回答

4

從AwsConsoleApp.java AWS SDK示例:

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."); 
} 
+0

雖然我需要一個PHP代碼,但這段代碼給了我一些關於如何編寫的想法。謝謝。 – Stranger

+0

啊,對不起,沒有看標籤:) – jimpic

0

在S3中沒有什麼叫做「文件夾」,它是一個平面文件系統。文件名(存儲桶密鑰)可能包含斜槓(/),各種存儲桶探索者可以使用它來解釋文件夾文件結構。

要知道S3中「文件夾」的大小,首先必須知道包含該「文件夾」路徑的子字符串的所有單個文件的關鍵字。如果您的存儲桶包含數百萬個文件,這將是一個非常昂貴的操作。

一些S3探險家會自動執行此操作。我使用S3的Cloudberry資源管理器。

0

文件夾在S3中並不存在。

軟件顯示密鑰爲subfolder/myfile.txt的對象在subfolder文件夾中。但它只是一個顯示的東西,該文件夾並不存在。如果您想要查找該文件夾中有多少項目,請遍歷所有以子文件夾開頭的對象/獲取它們的大小並添加它們。或者查看S3Browser,通過右鍵單擊給出尺寸。

5

,如果你想在Python中使用博託這裏是一個小的腳本,您可以嘗試:

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 
+1

我發現s3有時會報告這個清單中導致更奇怪的總數的文件夾。請參閱http://stackoverflow.com/questions/9954521/s3-boto-list-keys-sometimes-returns-directory-key。我結束了用尾部斜線過濾掉文件。 – Thomas4019

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 
相關問題