如何通过aws s3 ls或s3api查询S3存储桶level2层级文件夹/对象大小?
当然可以!针对你这种嵌套结构的S3存储桶,我们完全可以用aws s3 ls或者aws s3api工具配合简单的文本处理工具来实现需求。下面给你两种实用的方案,根据你的需求选择就行:
方案1:用
aws s3 ls快速列出对象大小 aws s3 ls是最常用的S3查看工具,加上参数就能直接过滤并提取你要的信息:
如果你只想看level2路径下所有对象(包括子文件夹里的)的路径和大小,直接运行:
aws s3 ls s3://myBucket/level1/level2/ --recursive | awk '{print "对象路径: " $4, "大小: " $3 " 字节"}'
要是想让大小显示成更易读的单位(比如KB/MB),加上--human-readable参数:
aws s3 ls s3://myBucket/level1/level2/ --recursive --human-readable | awk '{print "对象路径: " $5, "大小: " $3}'
参数说明:
--recursive:递归列出指定前缀下的所有对象(包括子路径里的)--human-readable:把字节数转换成KB/MB/GB这类友好单位awk:用来提取输出里的大小和路径字段,调整$3/$4/$5对应不同输出列
如果只想看level2直接下属的对象(不包含子文件夹里的),去掉--recursive即可:
aws s3 ls s3://myBucket/level1/level2/ --human-readable
方案2:用
aws s3api+jq实现更灵活的处理 如果需要更复杂的筛选或者格式输出,aws s3api返回的JSON格式会更方便,配合jq(一款JSON处理工具)能轻松定制输出:
列出所有对象的路径和字节大小
aws s3api list-objects-v2 --bucket myBucket --prefix "level1/level2/" --query 'Contents[].{路径: Key, 大小: Size}' | jq -r '.[] | "\(.路径) \(.大小) 字节"'
自动转换为友好单位(KB/MB/GB)
如果想直接看到易读的大小单位,可以用jq写个小脚本处理:
aws s3api list-objects-v2 --bucket myBucket --prefix "level1/level2/" --query 'Contents[].{路径: Key, 大小: Size}' | jq -r ' # 定义转换友好单位的函数 def humanize(size): if size >= 1024*1024*1024 then "\(size/(1024*1024*1024)|floor) GB" elif size >= 1024*1024 then "\(size/(1024*1024)|floor) MB" elif size >= 1024 then "\(size/1024|floor) KB" else "\(size) B" end; # 输出路径和转换后的大小 .[] | "\(.路径) \(.humanize(.大小))" '
统计子文件夹的总大小
如果你的level2下面还有子文件夹(S3里其实是前缀),想统计每个子文件夹的总大小,可以用这个循环脚本:
# 先获取level2下所有子前缀(即子文件夹) aws s3api list-objects-v2 --bucket myBucket --prefix "level1/level2/" --delimiter "/" --query 'CommonPrefixes[].Prefix' | jq -r '.[]' | while read prefix; do # 计算当前前缀下所有对象的总大小 total_size=$(aws s3api list-objects-v2 --bucket myBucket --prefix "$prefix" --query 'sum(Contents[].Size)') echo "文件夹: $prefix 总大小: $total_size 字节" done
注意点
S3本身没有真正的“文件夹”概念,所有的层级都是对象Key里的前缀。上面的命令都是基于前缀过滤来模拟文件夹的操作,确保你的前缀路径结尾带/,避免匹配到类似level2abc这样的前缀哦。
内容的提问来源于stack exchange,提问作者Alec




