如何計算Bucket中某個Prefix下所有檔案的儲存大小?
通過OSS的清單或者列舉檔案的功能,您可以統計指定Prefix(首碼或者目錄)下所有檔案的儲存容量。通過統計儲存容量,有助於您瞭解儲存資源的使用方式,為最佳化儲存成本和提升儲存效率提供支撐。
方式對比
|
方式 |
描述 |
使用情境 |
|
清單 |
周期性擷取Bucket的Object資訊及其中繼資料的資訊清單檔。支援掃描指定Prefix的Object、清單內容支援自訂、例如只匯出Object大小和儲存類型等。資訊清單檔以CSV格式儲存。 |
|
|
列舉檔案 |
通過ListObjects即時擷取Bucket的Object列表,可通過Prefix、最大返回數量等條件來靈活控制查詢的結果,適合特定條件下的快速查詢。 |
|
使用清單
例如,您希望匯出Bucket內首碼(Prefix)為bill/的所有檔案的清單,並統計bill/首碼所有檔案的總儲存容量。
-
配置清單規則。
-
在Object Storage Service控制台的Bucket列表頁面,單擊目標Bucket。
-
在左側導覽列,選擇。
-
在Bucket 清單頁面,單擊建立清單。
-
在設定清單報告規則面板,按以下說明配置各項參數,其他參數保留預設配置,然後單擊確定。
參數
說明
規則名稱
自訂清單任務的名稱,本樣本為inventory001。
儲存清單 Bucket
選擇當前Bucket名稱。
清單報告匯出周期
選擇每天。
清單內容
選中Object 大小。
按首碼匹配
設定為
bill/。
-
-
通過資訊清單檔統計bill首碼所有檔案的總儲存容量。
-
在檔案清單頁面,找到Bucket名稱/清單ID/data/路徑下以csv.gz結尾的資訊清單檔。
-
單擊資訊清單檔右側的,將檔案下載到本地路徑,並完成解壓。
-
統計檔案儲存體容量大小。
開啟csv資訊清單檔,檔案中的C列資料總大小即為bill首碼所有檔案的總儲存容量,單位為位元組。
-
-
(可選)刪除清單規則。
-
設定清單報告匯出周期為每天,能夠滿足您快速擷取資訊清單檔的需求。在清單規則未被刪除前,OSS會按照清單規則每天產生資訊清單檔。資訊清單檔會產生儲存費用。為避免產生不必要的費用,如果您不需要頻繁擷取最新的資訊清單檔,建議您在首次產生資訊清單檔後,及時刪除相應的清單規則。
在 Bucket 清單 頁面,找到目標清單(如
inventory001),單擊其操作列的 刪除。 -
如果您需要周期性頻繁擷取最新的資訊清單檔,則保留當前配置的清單規則。
-
列舉檔案
使用阿里雲SDK
以下提供常見SDK列舉指定Prefix下所有檔案的總儲存容量的範例程式碼。
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Endpoint對應的Region資訊,例如cn-hangzhou。
String region = "cn-hangzhou";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 指定Prefix。
String keyPrefix = "bill/";
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 顯式聲明使用 V4 簽名演算法
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
// 初始設定檔案總大小變數。
long totalSize = 0L;
try {
ObjectListing objectListing = null;
do {
// 列舉檔案。
ListObjectsRequest request = new ListObjectsRequest(bucketName).withDelimiter("/").withPrefix(keyPrefix);
if (objectListing != null) {
request.setMarker(objectListing.getNextMarker());
}
objectListing = ossClient.listObjects(request);
List<String> folders = objectListing.getCommonPrefixes();
for (String folder : folders) {
long folderSize = calculateFolderLength(ossClient, bucketName, folder);
totalSize += folderSize;
System.out.println(folder + " : " + (folderSize / 1024) + "KB");
}
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
totalSize += s.getSize();
System.out.println(s.getKey() + " : " + (s.getSize() / 1024) + "KB");
}
} while (objectListing.isTruncated());
System.out.println("Total Size: " + (totalSize / 1024) + "KB");
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
// 擷取指定Prefix下所有檔案的總儲存容量。
private static long calculateFolderLength(OSS ossClient, String bucketName, String folder) {
long size = 0L;
ObjectListing objectListing = null;
do {
// MaxKey預設值為100,最大值為1000。
ListObjectsRequest request = new ListObjectsRequest(bucketName).withPrefix(folder).withMaxKeys(1000);
if (objectListing != null) {
request.setMarker(objectListing.getNextMarker());
}
objectListing = ossClient.listObjects(request);
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
size += s.getSize();
}
} while (objectListing.isTruncated());
return size;
}
}
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 指定Prefix。
prefix = 'bill/'
def calculate_storage_size(prefix):
total_size = 0
# 列舉以指定Prefix開頭的所有Object.
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
total_size += obj.size # 累加Object的大小。
return total_size
if __name__ == "__main__":
size = calculate_storage_size(prefix)
print(f'Total size of objects with prefix "{prefix}": {size} bytes')
使用命令列工具ossutil
您可以使用ossutil查看某個prefix下所有檔案的總儲存容量。具體步驟,請參見du(擷取大小)。
> 下載