You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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脚本实现多线程批量复制,性能提升明显:

  1. 先安装依赖:pip install boto3
  2. 运行如下脚本:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:09:02