使用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
相关产品推荐
相关产品推荐

