我有一个非常大的桶(数十万个对象)。我有一条路径(假设 s3://myBucket/path1/path2)。 /path2 获取也是文件夹的上传内容。因此,示例可能如下所示:
s3://myBucket/path1/path2/v6.1.0
s3://myBucket/path1/path2/v6.1.1
s3://myBucket/path1/path2/v6.1.102
s3://myBucket/path1/path2/v6.1.2
s3://myBucket/path1/path2/v6.1.25
s3://myBucket/path1/path2/v6.1.99
S3 不考虑版本号排序(这是有道理的),但按字母顺序,列表中的最后一个并不是最后上传的。在该示例中.../v6.1.102 是最新的。
这是我到目前为止所得到的:
aws s3api list-objects
--bucket myBucket
--query "sort_by(Contents[?contains(Key, \`path1/path2\`)],&LastModified)"´
--max-items 20000
因此,这里的一个问题是 max-items 似乎是按字母顺序从存储桶中的所有文件递归开始的。 20000 确实会访问我的文件,但浏览这么多文件是一个相当慢的过程。
所以我的问题有两个:
1 - 这仍在搜索整个存储桶,但我只想将其范围缩小到 path2/ 。我可以这样做吗?
2 - 这仅列出对象,是否可以仅提取路径列表?
基本上,最终目标是我只想要一个命令返回最新的文件夹名称,例如上面示例中的“v6.1.102”。
要回答#1,您可以添加--prefix path1/path2
限制您在存储桶中查询的内容。
对于按照最后修改时间排序,我只能想到用一个SDK来结合list_objects_v2 https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2 and head_object https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.head_object(boto3) 获取对象的最后修改并以编程方式排序
Update
或者,您可以反向排序LastModified
in jmespath http://jmespath.org/specification.html并返回第一项,为您提供最新的对象并从那里收集目录。
aws s3api list-objects-v2 \
--bucket myBucket \
--prefix path1/path2 \
--query 'reverse(sort_by(Contents,&LastModified))[0]'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)