如何将S3同存储桶内早于15天的文件移动到其他文件夹,求命令或Python脚本
你之前尝试的命令无法实现需求,原生aws s3 mv的--exclude/--include参数仅支持按文件名模式匹配,不支持按修改时间这类对象属性筛选。你可以通过以下两种方案实现需求:
方案一:使用AWS CLI实现
通过s3api list-objects-v2按修改时间筛选文件后,再逐个执行移动操作,Linux/macOS下可直接执行以下命令:
# 计算15天前的UTC时间戳 CUTOFF=$(date -u -d "-15 days" +%s) # 筛选符合条件的文件并移动 aws s3api list-objects-v2 --bucket BUCKETNAME --prefix "myfolder/" \ --query "Contents[?LastModified < \`$CUTOFF\`].Key" --output text | tr '\t' '\n' | while read KEY; do if [ -n "$KEY" ]; then # 替换路径前缀得到目标路径 TARGET_KEY=${KEY/#myfolder\//myotherfolder/} aws s3 mv "s3://BUCKETNAME/$KEY" "s3://BUCKETNAME/$TARGET_KEY" fi done
注意事项:
- 替换命令中的
BUCKETNAME、源前缀myfolder/、目标前缀myotherfolder/为你实际的存储桶和路径值 - 首次测试可先将
aws s3 mv替换为echo aws s3 mv,确认要移动的文件列表无误后再执行实际移动操作
方案二:使用Python脚本实现
依赖boto3库,需先执行pip install boto3安装,脚本示例如下:
import boto3 from datetime import datetime, timedelta, timezone # 自定义配置参数 BUCKET_NAME = "替换为你的存储桶名称" SOURCE_PREFIX = "myfolder/" TARGET_PREFIX = "myotherfolder/" # 排除最近N天修改的文件 EXCLUDE_DAYS = 15 # 初始化S3资源,默认读取aws configure配置的凭证 s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET_NAME) # 计算时间阈值:当前UTC时间减去15天 cutoff_time = datetime.now(timezone.utc) - timedelta(days=EXCLUDE_DAYS) for obj in bucket.objects.filter(Prefix=SOURCE_PREFIX): # 跳过路径占位的空文件夹对象 if obj.key.endswith('/'): continue # 仅移动修改时间早于阈值的文件 if obj.last_modified < cutoff_time: target_key = obj.key.replace(SOURCE_PREFIX, TARGET_PREFIX, 1) # S3移动操作等价于复制到目标路径后删除源文件 s3.Object(BUCKET_NAME, target_key).copy_from(CopySource=f"{BUCKET_NAME}/{obj.key}") obj.delete() print(f"移动完成:{obj.key} → {target_key}")
注意事项:
- 提前通过
aws configure配置好AWS访问凭证,不要在脚本中硬编码密钥信息 - 首次测试可注释掉
copy_from和delete两行代码,仅打印待移动的文件列表,确认无误后再执行实际操作
内容的提问来源于stack exchange,提问作者Some Java Guy
相关产品推荐
相关产品推荐

