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

时间:2017-06-20 13:48:50

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

以下是一个例子

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

有关详细信息click here

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

我已经完成了数百个文件。这样效率不高,因为您必须为每个文件提出请求。

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

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

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