統計目錄中的對象數量和大小
更新時間 2025-07-31 11:05:33
最近更新時間: 2025-07-31 11:05:33
分享文章
操作場景
如果您需要統計桶中目錄所占用的容量大小及其所含對象數量,可以使用目錄統計功能。
使用方式
一、 使用ZOS控制臺進行目錄統計
1. 在ZOS控制臺,點擊Bucket名稱進入"概覽"頁面。
2. 選擇“文件管理”頁簽,當前頁面將分頁顯示桶內的所有目錄和文件。
3. 選擇您需要統計的目錄,點擊"操作"列的"統計"。
4. 彈出"目錄統計"窗口后,統計任務啟動。統計對象數量較多的目錄時,可能需要一定的時間,請您耐心等待。在統計結束前,請不要關閉該窗口,否則統計會中斷。
5. "正在統計目錄"的提示語消失,表示統計任務已結束,目錄的統計數據將會顯示在窗口上。
6. 統計完成后,目錄的容量大小和數據生成時間也會在文件列表頁顯示。為保證時效性,該數據在一天后會自動清空。如需再次統計,請重新點擊統計。
注意
1. 統計對象數量較多的目錄時,可能需要一定的時間,請您耐心等待。
2. 控制臺僅支持統計對象數量在10萬以內的目錄。統計到的對象數量超過10萬后,將給出提示并中斷統計。如需統計對象數量在10萬以上的目錄,請參考使用方式二。
3. 目錄統計過程中,如有頻繁的對象上傳或刪除等操作,包括通過生命周期策略后臺執行的刪除操作,可能會影響統計結果。此時,可重新執行統計操作。
二、 使用SDK進行目錄統計
1. 請首先參考SDK開發者文檔中的ZOS對象存儲Python_SDK使用手冊.pdf,安裝SDK運行所需要的環境。
2. 參考以下示例代碼,完成目錄的統計。"用戶基本信息"中的內容請進行相應替換。
import boto3
# 用戶基本信息
access_key = "Your_Access_Key"
secret_key = "Your_Secret_Key"
endpoint = "Your_Endpoint"
bucket_name = "Your_Bucket_Name"
folder_name = "Your_Folder_Name"
# 統計結果 數據結構
# Count: 文件數量
# Size: 容量大小,單位bytes
# StorageTypeStandard: 標準存儲
# StorageTypeIa: 低頻存儲
# StorageTypeGlacier: 歸檔存儲
result = {
'Count': 0,
'Size': 0,
'StorageTypeStandard': {
'Count': 0,
'Size': 0,
},
'StorageTypeIa': {
'Count': 0,
'Size': 0,
},
'StorageTypeGlacier': {
'Count': 0,
'Size': 0,
}
}
def get_s3_client():
"""
獲取s3 client
"""
session = boto3.session.Session(access_key, secret_key)
s3_client = session.client("s3", endpoint_url=endpoint)
return s3_client
def folder_statistics(bucket_name, folder_name):
"""
文件夾存儲類型情況統計
:param bucket_name:存儲桶名稱
:param folder_name:文件夾名稱, 完整文件夾名, 比如: 'abc/def/ghi/jkl/'
:return: None
"""
params = {
'Bucket': bucket_name,
'Prefix': folder_name,
}
# 輔助函數 更新統計結果
def _update_result(result, versions):
for v in versions:
# 跳過文件目錄本體
if v['Key'] == params['Prefix']:
continue
size = v['Size']
storage = v['StorageClass']
result['Count'] += 1
result['Size'] += size
if storage == 'STANDARD':
storage = 'StorageTypeStandard'
elif storage == 'STANDARD_IA':
storage = 'StorageTypeIa'
elif storage == 'GLACIER':
storage = 'StorageTypeGlacier'
else:
continue
result[storage]['Count'] += 1
result[storage]['Size'] += size
s3_client = get_s3_client()
resp = s3_client.list_object_versions(**params)
_update_result(result, resp.get('Versions', []))
# 循環查詢并更新結果直到完全遍歷
while resp.get('IsTruncated', False):
next_key_marker = resp.get('NextKeyMarker')
next_version_id_marker = resp.get('NextVersionIdMarker')
print(f'list_object_versions is truncated, NextKeyMarker = {next_key_marker}, NextVersionIdMarker = {next_version_id_marker}')
params['KeyMarker'] = next_key_marker
if next_version_id_marker:
params['VersionIdMarker'] = next_version_id_marker
resp = s3_client.list_object_versions(**params)
_update_result(result, resp.get('Versions', []))
params.pop('KeyMarker', None)
params.pop('VersionIdMarker', None)
if __name__ == '__main__':
# 輸入桶名、文件夾名,進行統計
folder_statistics(bucket_name, folder_name)
print(f"標準存儲容量(單位bytes): {result.get('StorageTypeStandard', {}).get('Size', 0)}")
print(f"標準存儲文件數量: {result.get('StorageTypeStandard', {}).get('Count', 0)}")
print(f"低頻存儲容量(單位bytes): {result.get('StorageTypeIa', {}).get('Size', 0)}")
print(f"低頻存儲文件數量: {result.get('StorageTypeIa', {}).get('Count', 0)}")
print(f"歸檔存儲容量(單位bytes): {result.get('StorageTypeGlacier', {}).get('Size', 0)}")
print(f"歸檔存儲文件數量: {result.get('StorageTypeGlacier', {}).get('Count', 0)}")
print(f"文件夾下總容量(單位bytes): {result.get('Size', 0)}")
print(f"文件夾下總文件數量: {result.get('Count', 0)}")