我们的S3桶上有多个文件,具有相同的文件扩展名。
我想找到一种方法来列出所有这些文件扩展名,并在我们的桶中以人类可读的格式占用大量的空间。
例如,与其仅仅列出使用aws s3 ls s3://ebio-rddata --recursive --human-readable --summarize的所有文件
我只想列出文件扩展名和它们的总大小:
.basedon.peaks.l2inputnormnew.bed.full | total size: 100 GB
.adapterTrim.round2.rmRep.sorted.rmDup.sorted.bam | total size: 200 GB
.logo.svg | total size: 400 MB发布于 2022-01-12 22:33:00
下面是一个Python脚本,它将按扩展对对象进行计数,并按扩展计算总大小:
import boto3
s3_resource = boto3.resource('s3')
sizes = {}
quantity = {}
for object in s3_resource.Bucket('jstack-a').objects.all():
if not object.key.endswith('/'):
extension = object.key.split('.')[-1]
sizes[extension] = sizes.get(extension, 0) + object.size
quantity[extension] = quantity.get(extension, 0) + 1
for extension, size in sizes.items():
print(extension, quantity[extension], size)如果有一个没有扩展的对象,那就有点好笑了。
发布于 2022-01-12 18:51:12
为此,您必须使用SDK,使用您最喜欢的语言和脚本来递归地筛选出您想要的文件格式的对象。
然后将列表导出为csv或json,只要您更喜欢更易读。
发布于 2022-01-12 21:02:40
以下是如何使用awscli和其他几个命令行工具(grep和awk,在Mac和Linux上可以免费获得)来解决这个问题的想法。
aws s3 ls s3://mybucket --recursive \
| grep -v -E '^.+/$' \
| awk '{na=split($NF, a, "."); tot[a[na]] += $3; num[a[na]]++;} END {for (e in tot) printf "%15d %6d %s\n", tot[e], num[e], e};'一步一步,aws s3 ls s3://mybucket --recursive的结果如下所示:
2021-11-24 12:45:39 57600 cat.png
2021-09-29 13:15:48 93651 dog.png
2021-09-29 14:16:06 1448 names.csv
2021-02-15 15:09:56 0 pets/
2021-02-15 15:09:56 135 pets/pets.json通过grep -v -E '^.+/$'管道删除文件夹,结果如下所示:
2021-11-24 12:45:39 57600 cat.png
2021-09-29 13:15:48 93651 dog.png
2021-09-29 14:16:06 1448 names.csv
2021-02-15 15:09:56 135 pets/pets.json最后,为每一行调用AWK脚本。它分割句号字符(split($NF, a, "."))上每一行的最后一个字,这样就可以计算出文件扩展名是什么(存储在a[na]中)。然后,它根据tot[extension]中的扩展名聚合文件大小,并在num[extension]中按扩展名进行文件计数。它最终按扩展名打印出聚合文件大小和文件计数,如下所示:
151251 2 png
1448 1 csv
135 1 json您也可以很简单地解决这个问题,例如在Python中使用boto3 SDK。
https://stackoverflow.com/questions/70686857
复制相似问题