需求
将 S3 中的文件路径从:
1
| s3://foobar/expense/2023/12/02 00:00:00/2023-12-02 00:00:00.json
|
移动为:
1
| s3://foobar/expense/2023/12/02/2023-12-02.json
|
需要处理从某个日期到今天的所有文件。
实现方式
S3 没有直接的”移动”操作,需要先复制(COPY)再删除(DELETE)原对象。
安装依赖
Python 脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import boto3 import datetime
s3_client = boto3.client('s3')
bucket_name = 'foobar'
start_date = datetime.datetime(2023, 12, 1) end_date = datetime.datetime.now()
current_date = start_date while current_date <= end_date: original_key = f'expense/{current_date.year}/{current_date.month:02d}/{current_date.day:02d} 00:00:00/{current_date.strftime("%Y-%m-%d")} 00:00:00.json' new_key = f'expense/{current_date.year}/{current_date.month:02d}/{current_date.day:02d}/{current_date.strftime("%Y-%m-%d")}.json'
copy_source = { 'Bucket': bucket_name, 'Key': original_key } try: s3_client.copy(copy_source, bucket_name, new_key) print(f'Copied: {original_key} to {new_key}')
s3_client.delete_object(Bucket=bucket_name, Key=original_key) print(f'Deleted: {original_key}') except s3_client.exceptions.NoSuchKey: print(f'No such key: {original_key}') except Exception as e: print(f'Error: {e}')
current_date += datetime.timedelta(days=1)
|
注意事项
- 确保 AWS 凭证已配置(环境变量或
.aws/credentials 文件)
- 需要有足够的 S3 操作权限(复制和删除)
- 运行前建议备份重要数据
- 大量文件时可能需要处理 S3 分页响应