统计目录中的对象数量和大小
更新时间 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)}")