【问题标题】:AWS CLI S3API find newest folder in pathAWS CLI S3API 在路径中找到最新的文件夹
【发布时间】:2018-04-24 02:36:43
【问题描述】:

我有一个非常大的桶(数十万个对象)。我有一条路径(比如说 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”。

【问题讨论】:

  • 使用head-object

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


【解决方案1】:

要回答 #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]'

【讨论】:

  • 谢谢!前缀绝对适用于缩小范围,我遇到反向语法错误:未知函数:反向但我可能可以从这里弄清楚。
  • 您的awscli 可能已过期?我使用版本 1.11.183 做到了这一点。 pip install -U awscli
  • 哦,就是这样。谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2022-01-08
      • 2015-06-11
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      相关资源
      最近更新 更多