AWS CLI S3API在路径中找到最新的文件夹

时间:2017-11-10 19:37:45

标签: amazon-web-services amazon-s3 aws-cli

我有一个非常大的桶(成千上万的物体)。我有一条路径(比方说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'。

3 个答案:

答案 0 :(得分:9)

要回答#1,您可以添加--prefix path1/path2来限制您在存储桶中查询的内容。

就上次修改的排序而言,我只能考虑使用SDK来组合list_objects_v2head_object(boto3)以在对象上进行最后修改并以编程方式排序

<强>更新

或者,您可以按jmespath中的LastModified反向排序,并返回第一项以提供最新对象并从那里收集目录。

aws s3api list-objects-v2 \
--bucket myBucket \
--prefix path1/path2 \
--query 'reverse(sort_by(Contents,&LastModified))[0]'

答案 1 :(得分:2)

如果您想要通用查询,例如&#34;最低版本&#34;,&#34;最高版本&#34;,&#34;所有v6.x版本&#34;然后考虑使用版本号维护一个单独的数据库。

如果您只需要知道最高版本号,并且需要快速检索(比列表对象调用更快),那么您可以单独维护该版本号。例如,您可以使用Lambda函数响应上传到path1 / path2的对象,其中Lambda函数负责将它在s3://mybucket/version.max中看到的最高版本号存储到文件中。 / p>

答案 2 :(得分:0)

前缀使用boto3客户端与list_object一起使用。但是使用boto3资源可能会带来一些问题。分页中的分页器是一个很棒的概念,效果很好!查找最新更改(对象的添加):sort_by(contents)[-1]