统计 S3 桶内特定扩展名对象数量与容量
2026年4月25日大约 2 分钟
统计 S3 桶内特定扩展名对象数量与容量
有时需要临时统计一个 S3 桶中某类文件的数量和容量,例如 .jpg、.png 图片对象。如果桶开启了版本控制,还要把历史版本也算进去。这种需求不一定适合等 S3 Inventory,AWS CLI 直接流式统计更快。
场景
目标是统计某个开启版本控制的 S3 桶内:
- 指定扩展名对象数量。
- 指定扩展名对象总容量。
- 包含所有历史版本,而不只是当前版本。
如果业务要求“现在就要结果”,S3 Inventory 不一定合适,因为它是异步报表,首次生成通常有延迟。
为什么用 list-object-versions
普通 list-objects 只看当前对象版本,不能覆盖历史版本。开启版本控制的桶应使用:
aws s3api list-object-versions再通过 --query 'Versions[*].[Key, Size]' 只取对象 Key 和 Size,减少后续处理成本。
统计命令
下面示例统计 .jpg 和 .png:
aws s3api list-object-versions \
--bucket <bucket-name> \
--region <region> \
--query 'Versions[*].[Key, Size]' \
--output text |
grep -Ei "\.(jpg|png)[[:space:]]+[0-9]+$" |
awk '
BEGIN {
fmt = "图片对象总数(含历史版本): %d\n"
}
{
count++;
size += $NF;
}
END {
print "======================";
printf fmt, count;
printf "总容量(含历史版本): %.2f GB\n", size/1024/1024/1024;
print "======================";
}'示例输出:
======================
图片对象总数(含历史版本): 120446
总容量(含历史版本): 56.33 GB
======================注意事项
- 建议在同区域 EC2 上执行,减少网络延迟。
- 如果对象很多,CLI 调用会产生 List 请求费用。
- 如果要统计当前版本,不要用
list-object-versions,改用list-objects-v2。 - 如果对象规模特别大、可接受延迟,S3 Inventory 更适合做周期性报表。
- 如果 Key 中包含换行等特殊字符,文本管道处理会有边界问题,严谨场景建议用 JSON + jq。
总结
紧急统计 S3 桶中特定扩展名对象时,list-object-versions + grep + awk 是一个简单有效的方案。它的优点是实时、轻量、无需等待 Inventory;缺点是更偏一次性统计,不适合长期周期报表。
