如何在S3存储桶间递归复制数据并保留目录结构?
复制S3存储桶递归目录结构到目标桶的方法
一、使用AWS CLI(最便捷的批量方式)
AWS CLI的cp命令默认支持递归复制,且会完整保留源桶的前缀结构(即你看到的目录层级)。
全桶复制
直接执行以下命令,就能把源桶内所有对象(含所有子目录结构)复制到目标桶:
aws s3 cp s3://source-bucket/ s3://target-bucket/ --recursive
过滤复制(可选)
如果只需要复制特定类型文件,比如仅复制.txt文件,可结合排除/包含参数:
aws s3 cp s3://source-bucket/ s3://target-bucket/ --recursive --exclude "*" --include "*.txt"
二、使用S3控制台操作(可视化方式)
适合少量文件或不熟悉命令行的场景:
- 打开S3控制台,进入源存储桶
- 选中根路径下所有对象(或指定要复制的顶层目录)
- 点击顶部「复制」按钮
- 在弹窗中输入目标桶名称(如需放到目标桶的特定子路径,可追加前缀,比如
s3://target-bucket/backup/) - 确认后启动复制,控制台会自动保留原有的目录层级结构
三、使用Python Boto3 SDK(自定义脚本场景)
如果需要自定义复制逻辑(比如增量同步、日志记录),可以用Boto3编写脚本:
import boto3 # 初始化S3客户端 s3 = boto3.client('s3') source_bucket = "你的源桶名称" target_bucket = "你的目标桶名称" # 分页遍历源桶所有对象 paginator = s3.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=source_bucket): if 'Contents' in page: for obj in page['Contents']: # 保留原对象的键(即目录+文件名)完成复制 copy_source = {'Bucket': source_bucket, 'Key': obj['Key']} s3.copy(copy_source, target_bucket, obj['Key'])
关键注意事项
- 权限要求:执行操作的IAM身份(用户/角色)需拥有源桶的
s3:GetObject、s3:ListBucket权限,以及目标桶的s3:PutObject权限。 - 跨区域复制:源桶和目标桶不在同一区域时,CLI、控制台、SDK都会自动处理跨区域传输,无需额外配置(若需长期自动同步可配置S3跨区域复制CRR)。
- 增量同步:如果只需复制新增/更新的对象,CLI可添加
--update参数:aws s3 cp s3://source-bucket/ s3://target-bucket/ --recursive --update
内容的提问来源于stack exchange,提问作者Oxana Grey
相关产品推荐
相关产品推荐

