如何把指定阿里云文件夹下的所有文件移动到另一个文件夹下,移动文件时把文件名称(不包括文件后缀)进行md5编码

如何把指定阿里云文件夹下的所有文件移动到另一个文件夹下,移动文件时把文件名称(不包括文件后缀)进行md5编码。

安装SDK:

bash

pip install oss2

编写Python脚本:

复制代码
 # 认证信息
# 认证信息
auth = oss2.Auth('YOUR_ACCESS_KEY_ID', 'YOUR_ACCESS_KEY_SECRET')
bucket_name = 'YOUR_BUCKET_NAME'
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com' # 替换为你的Region的Endpoint

    bucket = oss2.Bucket(auth, endpoint, bucket_name)


    # 源目录和目标目录
    source_prefix = 'house_mp4/'
    target_prefix = 'house/'
    print("=" * 60)
    print("开始安全的文件重命名和移动操作")
    print("=" * 60)
    
    processed_count = 0
    error_count = 0
    skipped_count = 0
    
    try:
        for obj in oss2.ObjectIterator(bucket, prefix=source_prefix):
            if obj.key == source_prefix:
                continue
                
            old_key = obj.key
            print(f"\n🔍 处理: {old_key}")
            
            old_name = old_key.split('/')[-1]
            
            if not old_name.lower().endswith(('.mp4', '.mov', '.avi', '.mkv')):
                print("⏭️  跳过非视频文件")
                skipped_count += 1
                continue
            
            # URL解码
            decoded_name = urllib.parse.unquote(old_name)
            
            # 分离文件名和扩展名
            if '.' in decoded_name:
                file_base_name, file_extension = decoded_name.rsplit('.', 1)
            else:
                file_base_name, file_extension = decoded_name, ''
            
            # MD5编码
            md5_hash = hashlib.md5(file_base_name.encode('utf-8')).hexdigest()
            
            # 构建新文件名
            new_file_name = f"{md5_hash}.{file_extension}" if file_extension else md5_hash
            new_key = target_prefix + new_file_name
            
            # 检查目标是否存在
            if bucket.object_exists(new_key):
                print(f"⚠️  目标已存在,跳过: {new_file_name}")
                skipped_count += 1
                continue
            # print(f"✅ 成功: {old_name} -> {new_file_name}")
            # break
            
            # 执行操作
            try:
                print(f"📋 复制: {old_key} -> {new_key}")
                bucket.copy_object(bucket_name, old_key, new_key)
                
                print(f"🗑️  删除原文件: {old_key}")
                bucket.delete_object(old_key)
                
                print(f"✅ 成功: {old_name} -> {new_file_name}")
                processed_count += 1
                
                # 添加短暂延迟,避免API限制
                time.sleep(0.1)
                # break
                
            except Exception as e:
                print(f"❌ 操作失败: {e}")
                error_count += 1
                continue
                
    except Exception as e:
        print(f"💥 严重错误: {e}")
    
    # 输出统计信息
    print("\n" + "=" * 60)
    print("处理统计:")
    print(f"✅ 成功处理: {processed_count} 个文件")
    print(f"⚠️  跳过: {skipped_count} 个文件")
    print(f"❌ 错误: {error_count} 个文件")
    print("=" * 60)
相关推荐
ITxiaobing2023几秒前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶10 分钟前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课30 分钟前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
小羊没烦恼!34 分钟前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
CableTech_SQH1 小时前
行业运维新标杆:百盛3D全场景运维系统
运维·数据库·信息与通信·综合布线
ITOM运维行者1 小时前
WAN监控怎么做?从链路质量指标到路径级定位的完整方法
数据库·人工智能·机器学习
太理摆烂哥2 小时前
MySQL库的操作
数据库·mysql
Dreamboat-L2 小时前
日志级别基础 + Spring Boot 日志实践指南
java·服务器·数据库·java-ee·springboot
野生数据人2 小时前
ES DSL 转 SQL 速查表:20 条子句对照 + 一条能直接跑的改写示例
大数据·数据库
野生数据人2 小时前
采集链路改投 Doris 速查手册:三条路径对照、output 配置项清单、报错处理表
大数据·数据库