首页 > 解决方案 > 将具有特定扩展名的文件从多个 S3 对象移动到另一个 S3 存储桶

问题描述

我有以下 S3 存储桶结构:

s3://<bucket_name>/
|---object_1/
|   |---images/
|   |   |---<image_11.jpg>
|   |   |---<image_12.jpg>
|   |---annotation/
|   |   |---<image_11.xml>
|   |   |---<image_12.xml>
|---object_2/
|   |---images/
|   |   |---<image_21.jpg>
|   |   |---<image_22.jpg>
|   |---annotation/
|   |   |---<image_21.xml>
|   |   |---<image_22.xml>

我想将所有图像和注释文件分别移动到两个单独的 S3 对象中,以便目标对象结构如下所示:

s3://<bucket_name>/
|---all-images/
|   |---<image_11.jpg>
|   |---<image_12.jpg>
|   |---<image_21.jpg>
|   |---<image_22.jpg>
|---all-annotation/
|   |---<image_11.xml>
|   |---<image_12.xml>
|   |---<image_21.xml>
|   |---<image_22.xml>

问题

我已经尝试过这个StackOverflow 问题的解决方案,但它不会改变 S3 对象结构。所有文件都使用文件夹名称(此处为object_1/images/image_11.jpg)复制。我希望将所有图像放在一起,而不需要一个对象下的目录结构(此处为all-images/<all_the_jpg_files>)。如何使用 AWS CLI 或 Sage Maker 笔记本实例实现这一目标?

标签: amazon-web-servicesamazon-s3aws-cli

解决方案


步骤1

使用此 StackOverflow 问题作为参考创建前缀列表。

第2步

迭代前缀列表(这里,,object_1... obkect_2)和cp/或sync目标存储桶的源存储桶。以下命令是我在 Sage Maker 笔记本实例上使用的命令。

!/bin/bash  
for label in list_of_prefixes:
    !aws s3 cp --recursive 's3://<bucket_name>/f"{label}"/images/' 's3://<bucket_name>/all-images/'

推荐阅读