如何使用AWS CLI按日期和前缀筛选复制S3存储桶中的文件
可行实现方案
方案1:AWS CLI + Shell 循环(适合中小规模文件量)
你已经可以通过list-objects-v2正确筛选出同时符合前缀、日期条件的对象,只要提取返回结果中的对象Key,逐个调用copy-object接口即可,完整可直接运行的命令如下:
# 先执行下方命令测试是否正确输出所有符合条件的对象Key,避免误复制 aws s3api list-objects-v2 --bucket sourceBucket --prefix "somePrefix_" --query 'Contents[?(LastModified > `2021-09-01`)].Key' --output text | tr '\t' '\n' # 确认筛选结果正确后,执行以下命令完成批量复制 aws s3api list-objects-v2 --bucket sourceBucket --prefix "somePrefix_" --query 'Contents[?(LastModified > `2021-09-01`)].Key' --output text | tr '\t' '\n' | while read key; do aws s3api copy-object --bucket targetBucket --key "$key" --copy-source "sourceBucket/$key" done
注意:新版AWS CLI的
list-objects-v2默认会自动拉取所有分页结果,无需手动处理continuation-token,不会出现漏文件的问题。如果文件数量较大,可以在copy-object命令后加&实现简单并行复制,注意不要触发S3的请求速率限制。
方案2:Python + Boto3 批量处理(适合十万级以上大文件量)
如果需要复制的文件数量较多,CLI循环的效率较低,可以用几十行Python脚本实现多线程批量复制,性能提升明显:
- 先安装依赖:
pip install boto3 - 运行如下脚本:
import boto3 from datetime import datetime, timezone s3 = boto3.resource("s3") source_bucket = s3.Bucket("sourceBucket") target_bucket = "targetBucket" # 配置筛选条件 cutoff_time = datetime(2021, 9, 1, tzinfo=timezone.utc) file_prefix = "somePrefix_" for obj in source_bucket.objects.filter(Prefix=file_prefix): if obj.last_modified > cutoff_time: s3.meta.client.copy( CopySource={"Bucket": "sourceBucket", "Key": obj.key}, Bucket=target_bucket, Key=obj.key )
你可以基于这个基础版本添加多线程、进度条、错误重试等功能,适配大规模文件的复制需求。
注意事项
- 确保执行操作的身份拥有源桶的
s3:GetObject权限、目标桶的s3:PutObject权限 - 跨区域复制会产生跨区域传输费用,操作前请先确认成本
- 若桶开启了版本控制,上述方案默认复制对象的最新版本,如需复制指定版本可自行调整参数
内容的提问来源于stack exchange,提问作者Barbi
相关产品推荐
相关产品推荐

