使用文件索引将文件从S3存储桶复制到本地计算机

时间:2016-10-29 19:34:01

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

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

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

我想用aws cli来做这件事,虽然我对其他建议持开放态度。

2 个答案:

答案 0 :(得分:1)

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

  1. 如果只添加对象(从不删除),那么您可以在上传对象时使用键命名约定,以便您轻松找到第二个最旧的对象,例如0001-xxx,0002-xxx。然后,您可以通过列出前缀为0002的对象来找到第二个最旧的对象。
  2. 维护RDBMS或KV数据库中对象的独立索引,使您可以轻松地在S3层次结构的任何部分中找到第二个最旧对象的S3键。可能通过在放置或删除对象时调用的Lambda函数来维护数据库。
  3. 使用在对象PUT上触发的Lambda函数,该函数枚举相关文件夹中的所有对象'并将第二个最旧的对象的密钥写回同一文件夹中的一种索引对象(或已知索引对象上的元数据)。然后,您可以通过获取索引对象(或其元数据)的内容找到第二个最旧的。
  4. 选项#2可能是最好的,因为它简单,快速,灵活(如果您的应用随着时间的推移而变化,您会发现您还需要知道第4个最旧的对象,或者第2个最新的对象对象)。

答案 1 :(得分:1)

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

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

这也适用于BUCKET-NAME/PATH

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