帮助文档 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
帮助文档 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 对象存储
  4. 操作指南
  5. 对象文件(Object)
  6. 文件常见问题
  7. 其他常见问题
  8. 如何计算Bucket中某个Prefix下所有文件的存储大小?

如何计算Bucket中某个Prefix下所有文件的存储大小?

  • 其他常见问题
  • 发布于 2025-04-21
  • 0 次阅读
文档编辑
文档编辑

通过OSS的清单或者列举文件的功能,您可以统计指定Prefix(前缀或者目录)下所有文件的存储容量。通过统计存储容量,有助于您了解存储资源的使用情况,为优化存储成本和提升存储效率提供支撑。

方式对比

方式

描述

使用场景

清单

周期性获取Bucket的Object信息及其元数据的清单文件。支持扫描指定Prefix的Object、清单内容支持自定义、例如只导出Object大小和存储类型等。清单文件以CSV格式保存。

  • Bucket内Object数量较多(例如100亿),需要定期获取Object列表信息的场景,例如了解不同业务的空间使用情况。

  • 需要存档某些Object元数据供后续使用

列举文件

通过ListObjects实时获取Bucket的Object列表,可通过Prefix、最大返回数量等条件来灵活控制查询的结果,适合特定条件下的快速查询。

  • Bucket中Object数量较少(例如几千个Object)

  • 需要频繁查询实时Object信息的场景,例如文件上传后需要快速验证文件是否存在

使用清单

例如,您希望导出Bucket内前缀(Prefix)为bill/的所有文件的清单,并统计bill/前缀所有文件的总存储容量。

  1. 配置清单规则。

    1. 在对象存储OSS控制台的Bucket列表页面,单击目标Bucket。

    2. 在左侧导航栏,选择数据管理 > Bucket 清单。

    3. 在Bucket 清单页面,单击创建清单。

    4. 在设置清单报告规则面板,按以下说明配置各项参数,其他参数保留默认配置,然后单击确定。

      bill.jpg

      参数

      说明

      规则名称

      自定义清单任务的名称,本示例为inventory001。

      存储清单 Bucket

      选择当前Bucket名称。

      清单报告导出周期

      选择每天。

      清单内容

      选中Object大小。

      按前缀匹配

      设置为bill/。

  2. 通过清单文件统计bill前缀所有文件的总存储容量。

    1. 在文件列表页面,找到Bucket名称/清单ID/data/路径下以csv.gz结尾的清单文件。

      bill.jpg

    2. 单击清单文件右侧的more > 下载,将文件下载到本地路径,并完成解压。

    3. 统计文件存储容量大小。

      打开csv清单文件,文件中的C列数据总大小即为bill前缀所有文件的总存储容量,单位为字节。

  3. (可选)删除清单规则。

    • 设置清单报告导出周期为每天,能够满足您快速获取清单文件的需求。在清单规则未被删除前,OSS会按照清单规则每天生成清单文件。清单文件会产生存储费用。为避免产生不必要的费用,如果您不需要频繁获取最新的清单文件,建议您在首次生成清单文件后,及时删除相应的清单规则。

      bill.jpg

    • 如果您需要周期性频繁获取最新的清单文件,则保留当前配置的清单规则。

列举文件

使用阿里云SDK

以下提供常见SDK列举指定Prefix下所有文件的总存储容量的示例代码。

Java

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
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";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 指定Prefix。
        String keyPrefix = "bill/";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        // 初始化文件总大小变量。
        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下所有文件的总存储容量。具体步骤,请参见查询指定目录下所有Object的大小。

相关文档

  • 存储空间清单常见问题

  • 列举文件常见问题

相关文章

如何筛选OSS指定时间范围内的文件 2025-04-21 18:16

如果您希望筛选OSS Bucket中指定时间范围的Object,您可以使用数据索引功能。通过设置Object最后修改时间的起始和结束日期,提高查询效率,适用于审计追踪、数据同步、周期性备份、成本分析或其他业务场景中对时效性文件的精准获取需求。 使用场景 审计与合规性检查

OSS有几种数据校验方式? 2025-04-21 18:16

OSS支持ETag、MD5、crc64校验方式,本文为您介绍三者的区别和使用场景。

报错ApkDownloadForbidden怎么处理? 2025-04-21 18:16

本文介绍访问文件时报错ApkDownloadForbidden的原因和解决方法。 问题现象 通过Bucket外网域名(bucketname.oss-[region].aliyuncs.com)或者传输加速域名(

报错ExternalRedirectForbidden怎么处理 2025-04-21 18:16

本文介绍访问文件时报错ExternalRedirectForbidden的原因和解决方法。 问题现象 通过Bucket外网域名(bucketname.oss-[region].aliyuncs.com)或者传输加速域名(

OSS怎样上传下载文件夹(目录)? 2025-04-21 18:16

与传统文件系统中的层级结构不同,OSS内部使用扁平结构存储数据,即所有数据均以对象(Object)的形式保存在存储空间(Bucket)中。为方便管理,OSS管理控制台将所有文件名以正斜线(/)结尾的文件显示为文件夹,实现类似于Windows文件夹的基本功能。本文介绍上传及下载文件夹的多种方式。

OSS有哪些批量操作? 2025-04-21 18:16

对象存储OSS提供丰富的访问和管理文件(Object)的方式,为提升操作效率,您可以参照本文所示的方法批量管理文件,例如批量上传、下载、复制、删除文件等。 批量上传

目录
Copyright © 2025 your company All Rights Reserved. Powered by 博智数字服务平台.
闽ICP备08105208号-1