md5命名文件

用于处理指定文件夹及其子文件夹中的所有文件,将文件重命名为其内容的 MD5 哈希值,并按照原始文件夹的目录结构将重命名后的文件复制到另一个指定的目标文件夹中,同时生成一份日志文件记录原始文件路径与修改后文件路径的对应关系。原始文件夹内容保持不变,目标文件夹结构与原始文件夹一致,避免文件名冲突时会自动添加后缀以生成唯一文件名。

import os
import shutil
import hashlib

def calculate_md5(file_path):
    """计算文件的 MD5 值"""
    md5_hash = hashlib.md5()
    with open(file_path, 'rb') as f:
        for chunk in iter(lambda: f.read(4096), b""):
            md5_hash.update(chunk)
    return md5_hash.hexdigest()

def resolve_conflict(file_path):
    """解决文件名冲突,生成唯一文件名"""
    counter = 1
    base, ext = os.path.splitext(file_path)
    new_file_path = file_path

    # 如果文件名冲突,添加数字后缀
    while os.path.exists(new_file_path):
        new_file_path = f"{base}_{counter}{ext}"
        counter += 1

    return new_file_path

def organize_files_with_structure(root_folder, modified_root, log_txt):
    """重命名文件,保持原始文件目录结构"""
    with open(log_txt, 'w', encoding='utf-8') as log_file:
        for dirpath, _, filenames in os.walk(root_folder):
            for filename in filenames:
                old_file_path = os.path.join(dirpath, filename)

                if os.path.isfile(old_file_path):
                    # 计算 MD5 值并生成新文件路径
                    md5_name = calculate_md5(old_file_path)
                    extension = os.path.splitext(filename)[1]
                    # 创建与原始目录结构相同的路径
                    relative_path = os.path.relpath(dirpath, root_folder)
                    new_dir = os.path.join(modified_root, relative_path)
                    os.makedirs(new_dir, exist_ok=True)
                    new_file_path = os.path.join(new_dir, md5_name + extension)

                    # 解决文件名冲突
                    new_file_path = resolve_conflict(new_file_path)

                    # 复制文件到新路径
                    shutil.copy(old_file_path, new_file_path)

                    # 写入日志
                    log_file.write(f"{old_file_path} -> {new_file_path}\n")
                    print(f"处理文件: {old_file_path} -> {new_file_path}")

if __name__ == "__main__":
    # 指定原始文件夹路径
    folder_path = r"D:\T1"
    # 指定修改后文件夹根目录(可以单独设置)
    modified_root = r"D:\T1_modified"
    # 指定日志文件路径
    log_file = os.path.join(modified_root, "file_log.txt")

    if os.path.exists(folder_path):
        organize_files_with_structure(folder_path, modified_root, log_file)
        print(f"处理完成!日志已保存到 {log_file}")
        print(f"修改后文件存放在: {modified_root}")
    else:
        print("指定的文件夹不存在,请检查路径。")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值