【问题标题】:Copy list of files from S3 bucket to S3 bucket将文件列表从 S3 存储桶复制到 S3 存储桶
【发布时间】:2017-11-23 02:36:21
【问题描述】:

有没有办法可以将文件列表从一个 S3 存储桶复制到另一个存储桶?两个 S3 存储桶都在同一个 AWS 账户中。我可以使用 aws cli 命令一次复制一个文件:

     aws s3 cp s3://source-bucket/file.txt s3://target-bucket/file.txt

但是我有 1000 多个文件要复制。我不想复制源存储桶中的所有文件,因此无法使用同步命令。有没有办法使用需要复制的文件名列表来调用文件以自动执行此过程?

【问题讨论】:

  • 不是一个真正的答案,但可能对您来说很有趣。您可以使用存储桶上的库存管理非常便宜地生成存储桶列表。如果您有数百万个文件,这可以节省大量资金。

标签: amazon-web-services amazon-s3 cp


【解决方案1】:

您可以使用--exclude 和--include 过滤器,也可以在s3 cp 命令中使用--recursive 标志来复制多个文件

以下是一个例子

aws s3 cp /tmp/foo/ s3://bucket/ --recursive --exclude "*" --include "*.jpg"

更多详情click here

【讨论】:

    【解决方案2】:

    从 Python 方面解决这个问题,您可以运行一个 Python 脚本来为您解决这个问题。由于您有很多文件,因此可能需要一段时间,但应该可以完成工作。将以下代码保存在具有.py 扩展名的文件中并运行它。您可能需要事先在终端中运行pip install boto3,以防您还没有它。

    import boto3
    s3 = boto3.resource('s3')
    mybucket = s3.Bucket('oldBucket')
    list_of_files = ['file1.txt', 'file2.txt']
    for obj in mybucket.objects.all():
        if obj.key in list_of_files:
            s3.Object('newBucket', obj.key).put(Body=obj.get()["Body"].read())
    

    【讨论】:

    • 这个脚本会复制“oldbucket”中的所有文件,还是我可以使用一个列表来准确地告诉这个脚本要复制的文件列表?
    • 这将复制所有这些。您可以在 for 循环中添加 if 语句。我将进行编辑,以便它复制列表。
    • 谢谢,这正是我想要的!
    • 这个脚本似乎只会复制小于 5 GB 的文件。有没有办法启动较大文件所需的多部分副本?
    • 检查这个link out
    【解决方案3】:

    如果您想使用 AWS CLI,您可以在包含您要复制的文件名称的文件上循环使用 cp:

    while read FNAME
    do
      aws s3 cp s3://source-bucket/$FNAME s3://target-bucket/$FNAME
    done < file_list.csv
    

    我已经为几百个文件做了这个。它效率不高,因为您必须为每个文件发出请求。

    更好的方法是在一个cp 行中多次使用--include 参数。如果您可以在 shell 中从文件列表中生成所有这些参数,那么您将有效地拥有

    aws s3 cp s3://source-bucket/ s3://target-bucket/ --exclude "*" --include "somefile.txt" --include "someotherfile.jpg" --include "another.json" ...
    

    我会让更熟练的人弄清楚如何编写脚本。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2022-01-07
      • 2018-06-18
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多