将文件列表从 S3 存储桶复制到 S3 存储桶

Copy list of files from S3 bucket to S3 bucket

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

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

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

从 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())

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

下面是一个例子

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

更多详情click here

如果您想使用 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" ...

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