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