Загрузить с Amazon S3, AWS CLI или Boto3? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть список имен папок в текстовом файле, например:

folder_B
folder_C

В корзине S3 есть путь, где у меня есть папки, например:

folder_A
folder_B
folder_C
folder_D

Каждая из этихпапка имеет подпапки, такие как:

0
1
2
3

Для каждой папки в текстовом файле мне нужно найти папку в S3 и загрузить содержимое ее подпапки только с наибольшим номером.

Делать это с помощью pythonboto3 кажется сложным.

Это простой способ сделать это с помощью командной строки AWS?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вот простой bash one liner (при условии, что формат 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)

0 голосов
/ 22 февраля 2019

ОК, я сделал.Это действительно плохо, но это работает.Я использовал как 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')
...