【问题标题】:In S3 Bucket , Move large number of files in one folder into multiple folder在 S3 Bucket 中,将一个文件夹中的大量文件移动到多个文件夹中
【发布时间】:2021-11-27 18:29:05
【问题描述】:

目前,我在 S3 存储桶的一个文件夹中有 3000 万个文件 我想将 750 万个文件从其中移动到 S3 存储桶中的 4 个文件夹中

我尝试使用 AWS CLI 命令,但不知道如何提及其中的文件数

aws s3 mv s3://BUCKETNAME/myfolder/ s3://BUCKETNAME/folder1/ --recursive

如何循环并仅将 750 万个文件移动到每个文件夹中?

import boto3

aws_access_key_id = ""
aws_secret_access_key = ""
bucket_from = ""
bucket_to = ""
s3 = boto3.resource(
    's3',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)
src = s3.Bucket(bucket_from)

def move_files():
    for archive in src.objects.all():

        s3.meta.client.copy_object(
            ACL='public-read',
            Bucket=bucket_to,
            CopySource={'Bucket': bucket_from, 'Key': archive.key},
            Key=archive.key
        )

move_files()

【问题讨论】:

  • 明确地说,您希望增加命令行输出的详细程度,以便显示移动的文件总数?
  • 不,我想使用 aws cli 或 python 以自动方式将拆分的 3000 万个文件分成 7.5 个文件到每个文件夹中
  • 您需要单独“移动”每个文件。或者,编写一个程序(例如在 Python 中),通过将文件复制到新密钥然后删除原始文件来“移动”文件。
  • @JohnRotenstein 是的,但我想弄清楚如何在 python 中只移动 7.5 个文件

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


【解决方案1】:

我会推荐:

1.使用 Amazon S3 Inventory 获取对象列表

列出数百万个对象可能需要很长时间。相反,请使用Amazon S3 Inventory,它可以提供列出所有对象的每日或每周 CSV 文件。

这将为您提供当前对象的明确列表。

2。拆分为 4 个列表

使用文本编辑器将文件列表拆分为 4 个单独的文件 - 每个目标文件夹一个。

3.使用 Amazon S3 批量操作复制对象

复制数百万个对象需要很长时间,除非您对进程进行多线程处理。

更简单快捷的方法是Perform large-scale batch operations on Amazon S3 objects using S3 Batch Operations。它可以将 S3 Inventory 文件作为输入,然后为您并行执行所有复制操作。

4.清理

我建议您不要删除源文件,直到您确定所有复制都已正确完成。您可以再次使用 S3 Inventory 获取列表以进行比较。

一旦您想删除源文件,您可以使用 S3 Lifecycle 删除原始对象。 要非常小心不要同时删除复制的对象!仅出于这个原因,最好将对象从源文件复制到不同的存储桶

【讨论】:

  • 使用 s3 Batch 可以指定要移动的文件数吗?
  • 不,您必须提供要复制的特定文件的列表。 (注意它可以“复制”,但不能“移动”。)
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 2022-06-10
  • 2011-02-14
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多