从Amazon S3,AWS CLI或Boto3下载?

时间:2019-02-22 09:35:19

标签: python amazon-web-services amazon-s3 boto3 aws-cli

我在txt文件中有一个文件夹名称列表,例如:

folder_B
folder_C

在S3存储桶中有一个路径,其中有以下文件夹:

folder_A
folder_B
folder_C
folder_D

此文件夹中的每个文件夹都具有以下子文件夹:

0
1
2
3

对于文本文件中的每个文件夹,我都必须在S3中找到文件夹并下载其子文件夹中仅具有最高编号的内容。

通过python boto3进行此操作似乎很复杂。

这是通过AWS命令行执行此操作的简单方法吗?

2 个答案:

答案 0 :(得分:0)

好的,我做到了。确实很糟糕,但是可以。我同时使用了boto3和aws-cli

import subprocess
import boto3

folders = []
with open('folders_list.txt', 'r', newline='') as f:
    for line in f:
        line = line.rstrip()
        folders.append(line)

def download(bucket_name):
    s3_client = boto3.client("s3")
    result = s3_client.list_objects(Bucket=bucket_name, Prefix="my_path/{}/".format(folder), Delimiter="/")
    subfolders = []
    for i in result['CommonPrefixes']:
        subfolders.append(int(i['Prefix'].split('{}/'.format(folder),1)[1][:-1]))
    subprocess.run(['aws', 's3', 'cp', 's3://my_bucket/my_path/{0}/{1}'.format(folder, max(subfolders)),
                    'C:\\Users\it_is_me\my_local_folder\{}.'.format(folder), '--recursive'])

for folder in folders:
    download('my_bucket')

答案 1 :(得分:0)

这是一个简单的bash one衬纸(假设aws s3 ls的格式的文件名作为最后一列):

for bucket in $(cat folder.txt); do \
  aws s3 ls s3://bucket-prefix/$bucket | awk '{print $NF}' \
  | sort -r | head -n1 \
  | xargs -I {} aws s3 cp s3://bucket-prefix/$bucket/{} $bucket/{} --recursive \
  ; done
如果缺少目录,

aws-cli将负责创建目录。 (在Ubuntu上测试)