【问题标题】:Copy files from S3 bucket to local machine using file index使用文件索引将文件从 S3 存储桶复制到本地机器
【发布时间】:2023-03-22 16:10:02
【问题描述】:

我需要将文件从 S3 存储桶中的许多子目录复制到我的本地计算机。文件名是自动生成的,如果不首先使用ls 就很难获得,但我知道目标文件始终是子文件夹中按日期创建顺序的第二个文件。

有没有办法通过索引引用s3桶子文件夹文件中的文件?

我设想使用 aws cli 来执行此操作,但我愿意接受其他建议。

【问题讨论】:

  • 您能否使用示例目录结构更新您的问题,突出显示您要下载的文件?

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


【解决方案1】:

我不知道在 S3 中以任何方式列出第二旧的对象,而不列出给定前缀处的所有对象,然后按日期显式排序该列表。如果您需要这样做,那么这里有一些想法:

  1. 如果只添加过对象(从不删除),那么您或许可以在上传对象时使用键命名约定,以便轻松定位第二旧的对象,例如 0001-xxx、0002-xxx。然后,您可以通过列出前缀为 0002 的对象来查找第二旧的对象。
  2. 在 RDBMS 或 KV 数据库中维护对象的独立索引,以便您轻松定位 S3 层次结构中任何部分中第二旧对象的 S3 键。可能通过放置或删除对象时调用的 Lambda 函数来维护数据库。
  3. 使用在对象 PUT 上触发的 Lambda 函数,该函数枚举相关“文件夹”中的所有对象,并将第 2 个最旧对象的键写回同一文件夹中的一种索引对象(或作为已知索引对象)。然后,您可以通过获取索引对象(或其元数据)的内容来找到第二旧的。

选项 #2 可能是最好的,因为它简单、快速且灵活(如果随着时间的推移您的应用程序发生变化,您会发现您还需要知道第 4 个最旧的对象或第 2 个最新的对象)。

【讨论】:

  • 感谢您的建议。我现在因为之前没有实施 1 或 2 而自责。
【解决方案2】:

您可以使用此方法获取给定存储桶/路径中的第二个文件的名称:

aws s3api list-objects-v2 --bucket BUCKET-NAME --query 'Contents[1].Key' --output text

这也适用于BUCKET-NAME/PATH

但是,您提到您有许多子目录,因此如果您想避免列出完整的存储桶列表,则必须知道所有这些子目录的名称。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多