【问题标题】:Copy file from the s3 to the local?将文件从 s3 复制到本地?
【发布时间】:2020-10-30 16:41:55
【问题描述】:

我的 s3 存储桶中有很多文件,那么是否有任何 aws cli 命令可用于在 s3 中查找具有前缀名称的最新文件?以及如何将该文件从 s3 复制到我的本地文件夹?我可以使用 Boto3 或 python 库来执行此操作吗?

【问题讨论】:

  • 通常你会以一种更容易的格式排列你的数据。例如,您可以将文件放在YEAR/MONTH/DAY/file 路径中。

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


【解决方案1】:

这是用 Python 做的演示:

import boto3

s3_client = boto3.client('s3')

response = s3_client.list_objects_v2(Bucket='MY-BUCKET', Prefix='foo/')
objects = sorted(response['Contents'], key=lambda obj: obj['LastModified'])

## Latest object
latest_object = objects[-1]['Key']
filename = latest_object[latest_object.rfind('/')+1:] # Remove path

# Download it to current directory
s3_client.download_file('MY-BUCKET', latest_object, filename)

基本上,您会取回所有对象,然后按LastModified 对它们进行排序。

请注意,list_objects_v2() 命令最多只能返回 1000 个对象。如果存储桶有更多,则需要循环或使用分页器。见:Paginators — Boto3 documentation

【讨论】:

    【解决方案2】:

    此命令将列出给定前缀的“最新”对象:

    aws s3api list-objects --bucket MY-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text
    

    您可以将其与复制命令结合使用:

    key=$(aws s3api list-objects --bucket MY-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text)
    aws s3 cp s3://MY-BUCKET/$key .
    

    --query 参数非常强大。见:JMESPath Tutorial

    【讨论】:

    • 如何在 Python 脚本中使用它?
    • 我将为 Python 添加另一个答案。 (抱歉,您的问题令人困惑,因为您同时提到了 AWS CLI 和 boto。)
    【解决方案3】:

    您可以参考此答案以获取最新文件。 get last modified object from S3 CLI。对于要在对象列表中的前缀,您可以使用

    aws s3 ls $BUCKET --recursive | sort | grep <prefix>
    

    谢谢

    阿什

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多