You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS CLI获取Amazon S3文件夹层级大小过慢,求高效方案

我完全懂你这种痛苦——当你对着终端等了好几个小时,命令还卡在那一动不动,就为了拿个文件夹大小,实在太折磨人了。下面给你几个高效的方案,比递归遍历快得多:

高效获取S3文件夹层级大小的几种方案

方案一:使用S3 Inventory(最适合超大存储桶)

S3 Inventory是AWS官方专门解决大规模对象统计的工具,它会定期(每天/每周)为你指定的存储桶前缀生成一份包含所有对象元数据的清单文件(支持CSV、Parquet等格式),你只需要基于这份文件做简单汇总就能得到每个文件夹的大小。

操作步骤:

  • 登录S3控制台,找到目标存储桶,进入「管理」标签页的「清单」模块
  • 创建新清单任务:指定要统计的前缀(比如folder_name/),勾选需要的字段(至少选Size和Key),设置清单文件的输出位置(可以是同桶的其他前缀或其他桶)
  • 等待清单生成后,下载文件,用Excel透视表、Pandas或者Linux的awk命令按前缀分组汇总大小

优势:

  • 无需实时遍历对象,彻底避免长时间等待CLI命令的问题
  • 支持统计对象版本、删除标记等细节(按需选择)
  • 一次配置后定期自动更新清单,后续查大小直接用最新清单即可

方案二:用S3 API + 轻量工具实时汇总(适合中等规模文件夹)

aws s3 ls之所以慢,是因为它是高层级命令,会额外处理很多展示逻辑。换成更底层的s3api list-objects-v2命令,再结合jq或awk汇总大小,速度会快好几倍——尤其适合几十万到几百万级对象的场景。

直接计算文件夹总大小(转换为GB)的命令:

aws s3api list-objects-v2 --bucket bucket-name --prefix folder_name/ --recursive --output json | jq '[.Contents[].Size] | add / 1024 / 1024 / 1024'

如果没有jq,也可以用awk实现:

aws s3api list-objects-v2 --bucket bucket-name --prefix folder_name/ --recursive --query "Contents[].Size" --output text | awk '{sum+=$1} END {print sum/1024/1024/1024 " GB"}'

优势:

  • 实时获取结果,无需提前配置
  • 比aws s3 ls --summarize效率高很多,减少了不必要的输出和处理开销

方案三:自定义多线程脚本(适合特殊需求)

如果上面的方法满足不了你的个性化需求(比如同时统计多个文件夹、做复杂过滤),可以用AWS SDK写一个多线程脚本。比如用Python的boto3库,结合分页器和多线程并行遍历对象,速度会比单线程CLI快不少。

简单示例(Python):

import boto3
from concurrent.futures import ThreadPoolExecutor

def get_page_size(page):
    return sum(obj['Size'] for obj in page['Contents'])

def calculate_folder_size(bucket_name, prefix):
    s3 = boto3.client('s3')
    paginator = s3.get_paginator('list_objects_v2')
    pages = paginator.paginate(Bucket=bucket_name, Prefix=prefix)
    
    total_size = 0
    with ThreadPoolExecutor(max_workers=10) as executor:
        for size in executor.map(get_page_size, pages):
            total_size += size
    
    return round(total_size / 1024 / 1024 / 1024, 2)  # 转换为GB并保留两位小数

if __name__ == '__main__':
    bucket = 'your-bucket-name'
    folder_prefix = 'folder_name/'
    print(f"Total folder size: {calculate_folder_size(bucket, folder_prefix)} GB")

避坑提醒

  • 如果存储桶开启了版本控制,aws s3 ls和上述s3api命令默认只统计当前版本对象,若需统计所有版本,要在命令/脚本中添加对应参数(比如--include-deleted)
  • S3的「文件夹」本质是对象前缀,统计时一定要确保前缀以/结尾(比如folder_name/),否则会误包含类似folder_name_other的前缀对象

内容的提问来源于stack exchange,提问作者Saurav Bhowmick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:29:14