当前位置: 首页 > java >正文

如何把指定阿里云文件夹下的所有文件移动到另一个文件夹下,移动文件时把文件名称(不包括文件后缀)进行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的Endpointbucket = oss2.Bucket(auth, endpoint, bucket_name)# 源目录和目标目录source_prefix = 'house_mp4/'target_prefix = 'house/'print("=" * 60)print("开始安全的文件重命名和移动操作")print("=" * 60)processed_count = 0error_count = 0skipped_count = 0try:for obj in oss2.ObjectIterator(bucket, prefix=source_prefix):if obj.key == source_prefix:continueold_key = obj.keyprint(f"\n🔍 处理: {old_key}")old_name = old_key.split('/')[-1]if not old_name.lower().endswith(('.mp4', '.mov', '.avi', '.mkv')):print("⏭️  跳过非视频文件")skipped_count += 1continue# 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_hashnew_key = target_prefix + new_file_name# 检查目标是否存在if bucket.object_exists(new_key):print(f"⚠️  目标已存在,跳过: {new_file_name}")skipped_count += 1continue# 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)# breakexcept Exception as e:print(f"❌ 操作失败: {e}")error_count += 1continueexcept Exception as e:print(f"💥 严重错误: {e}")# 输出统计信息print("\n" + "=" * 60)print("处理统计:")print(f"✅ 成功处理: {processed_count} 个文件")print(f"⚠️  跳过: {skipped_count} 个文件")print(f"❌ 错误: {error_count} 个文件")print("=" * 60)
http://www.xdnf.cn/news/19551.html

相关文章:

  • 从理论到实践,深入剖析数据库水平拆分的安全平滑落地
  • Spark自定义累加器实现高效WordCount
  • Spark和Spring整合处理离线数据
  • promptoMANIA-AI绘画提示词生成器
  • Electron使用WebAssembly实现CRC-16 CCITT校验
  • macOS中Homebrew安装PHP的详细步骤(五)
  • 深入了解Flink核心:Slot资源管理机制
  • PostgreSQL 索引大全
  • 深入理解Docker容器技术:原理与实践
  • 如何安装CUDA????
  • three.js+WebGL踩坑经验合集(10.1):镜像问题又一坑——THREE.InstancedMesh的正反面显示问题
  • 机器学习-时序预测2
  • 基于FPGA+DSP数据采集处理平台的搭建
  • 【Vue2 ✨】Vue2 入门之旅(四):生命周期钩子
  • Unity核心概念③:Inspector窗口可编辑变量
  • C++/QT day3(9.1)
  • 深度学习中常用的激活函数
  • 关系型数据库——GaussDB的简单学习
  • Spring Boot 和 Spring Cloud 的原理和区别
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:BC141 井字棋及BC142 扫雷题目的解析
  • Composefile配置
  • 瑞芯微RK3576平台FFmpeg硬件编解码移植及性能测试实战攻略
  • 查看LoRA 哪个适配器处于激活状态(67)
  • 单片机元件学习
  • 设计模式:代理模式(Proxy Pattern)
  • 有N个控制点的三次B样条曲线转化为多段三阶Bezier曲线的方法
  • 【开题答辩全过程】以 基于微信小程序的校园二手物品交易平台的设计与实现为例,包含答辩的问题和答案
  • 8K4K图像评估平台
  • 【系统架构设计(七)】 需求工程之:面向对象需求分析方法:统一建模语言(UML)(下)
  • 像信号处理一样理解中断:STM32与RK3399中断机制对比及 Linux 驱动开发实战