对象存储

统计目录中的对象数量和大小

2025-12-24 02:27:31

本文为您介绍如何统计目录中的对象数量和大小。

操作场景

如果您需要统计桶中目录所占用的容量大小及其所含对象数量,可以使用目录统计功能。

使用方式

一、  使用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)}")

 

 



ujNY1ItSytoZ