2017-04-17 108 views
1

boto3を使用して、あるソースバケット内のすべてのファイルを他のターゲットバケットにコピーすることは可能ですか?ソースバケットには通常のフォルダ構造がありません。boto3 Pythonを使用してaws s3バケット間でファイルとフォルダを再帰的にコピーできますか?

Source bucket: SRC 
Source Path: A/B/C/D/E/F.. 
where in D folder it has some files, 
E folder has some files 

Target bucket: TGT 
Target path: L/M/N/ 

私はboto3を使用して、N個のフォルダの下にTGTバケットにフォルダCからSRCバケットの上からすべてのファイルとフォルダをコピーする必要があります。

APIを知っている人もいれば、このタスクを完了するために新しいPythonスクリプトを書く必要がありますか?

+0

aws cliには[sync](http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)コマンドを使用できます。私が知っている限り、boto3には同等のものはありません。 – Alasdair

+0

正しい。私たちはsyncまたはcpを使うことができます - aws cliでは再帰的ですが、私はboto3に必要です。そうでない場合は、それを実現するための独自のコードを記述する必要があります。私の理解は正しいですか? –

+0

Bucket.objects.all()を使用して各オブジェクトのイテレータを取得し、s3transferを使用してそれをコピーする方法もあります。ここにobjects.all()またはfilter()の例があります:http://stackoverflow.com/questions/36042968/get-all-s3-buckets-given-a-prefix/36044264#36044264 – mootmoot

答えて

5

S3ストアオブジェクトはフォルダを保存せず、 '/'または '\'でもオブジェクトキー名の一部です。キー名を操作してデータをコピーするだけで済みます。

import os 
import boto3 
old_bucket_name = 'SRC' 
old_prefix = 'A/B/C/' 
new_bucket_name = 'TGT' 
new_prefix = 'L/M/N/' 
s3 = boto3.resource('s3') 
old_bucket = s3.Bucket(old_bucket_name) 
new_bucket = s3.Bucket(new_bucket_name) 

for obj in old_bucket.objects.filter(Prefix=old_prefix): 
    old_source = { 'Bucket': old_bucket_name, 
        'Key': obj.key} 
    # replace the prefix 
    new_key = obj.key.replace(old_prefix, new_prefix) 
    new_obj = new_bucket.Object(new_key) 
    new_obj.copy(old_source) 
+0

あなたの応答に感謝します。私は分割と部分文字列のロジックをPythonで使用しています。問題は今解決されました –

+0

ありがとう!最後の行の 'source'は' old_source'ですか? –

+0

@CarlSmith:間違いを指摘してくれてありがとう。コードが更新されました。 – mootmoot

関連する問題