我知道这个命令可以提供存储桶中所有文件的大小:
aws s3 ls mybucket --recursive --summarize --human-readable但这并没有考虑到versioning。
如果我运行此命令:
aws s3 ls s3://mybucket/myfile --human-readable它将显示类似于"100 MiB“的内容,但它可能有该文件的10个版本,这将更像是"1 GiB”总数。
最接近的方法是获取给定文件的每个版本的大小:
aws s3api list-object-versions --bucket mybucket --prefix "myfile" --query 'Versions[?StorageClass=`STANDARD`].Size' > /tmp/s3_myfile_version_sizes然后取所有版本大小的总和。
但我必须为存储桶中的每个文件重新运行此命令。
有没有更简单的方法来做这件事?
发布于 2017-04-01 19:37:20
您可以在存储桶上整体运行list-object-versions:
aws s3api list-object-versions --bucket my-bucket --query 'Versions[*].Size'使用jq总结一下:
aws s3api list-object-versions --bucket my-bucket --query 'Versions[*].Size' | jq add或者,如果您需要人类可读的输出:
aws s3api list-object-versions --bucket my-bucket --query 'Versions[*].Size' | jq add | numfmt --to=iec-i --suffix=B你也可以添加一个前缀,以防你想知道一个给定的“文件夹”的大小,也许还能得到版本对象的数量:
aws s3api list-object-versions --bucket my-bucket --prefix my-folder --query 'Versions[*].Size' | jq 'length|add'或者,您可以使用jq过滤来编写更复杂的过滤器,例如,仅包含非当前对象:
aws s3api list-object-versions --bucket my-bucket --prefix my-folder | jq '[.Versions[]|select(.IsLatest == false)|.Size] | length,add'如果jq不可用,不幸的是,使用--output text选项会导致制表符分隔的值,所以这里有一个技巧,强制它分隔行,然后将总相加
aws s3api list-object-versions --bucket my-bucket --query 'Versions[*].[Size,Size]' --output text | awk '{s+=$1} END {printf "%.0f", s}'如果您有大量对象,使用Amazon S3 Storage Inventory提供的数据可能更好
亚马逊 S3 inventory每天或每周为S3存储桶或共享前缀(即名称以公共字符串开头的对象)提供对象及其相应元数据的逗号分隔值(CSV)平面文件输出。
发布于 2018-03-16 14:10:33
使用CloudWatch,它将给出所有版本控制的结果。
https://stackoverflow.com/questions/43150572
复制相似问题