有没有办法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS账户中。我可以使用aws cli命令一次复制一个文件:
aws s3 cp s3://source-bucket/file.txt s3://target-bucket/file.txt
但是我有1000多个要复制的文件。我不想复制源存储桶中的所有文件,因此我无法使用sync命令。有没有办法用需要复制的文件名列表调用文件来自动执行此过程?
答案 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" ...
我会让更熟练的人弄清楚如何编写脚本。