import hashlib
import os

# 定义生成 md5 值的目录
dir = "/home/od/Backup/DD/"

def batch_calculate_md5(folder_path):
    """
    批量计算文件夹及其子文件夹中所有不存在对应.md5.txt 的文件的 MD5 值，并生成对应的.md5.txt 文件，同时显示详细的操作日志，包括跳过的文件

    参数：
    folder_path (str): 文件夹的路径

    返回：
    None
    """
    processed_files = set()  # 用于存储已经有.md5.txt 的文件
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            if file_name.endswith('.md5.txt'):
                original_file = file_name[:-8]  # 去掉.md5.txt 后缀获取原始文件名
                processed_files.add(original_file)
        for file_name in files:
            file_path = os.path.join(root, file_name)
            if not os.path.isdir(file_path) and not file_name.endswith('.md5.txt') and file_name not in processed_files:
                md5 = calculate_md5(file_path)
                output_file = f"{file_name}.md5.txt"
                with open(os.path.join(root, output_file), 'w') as f:
                    f.write(f"{file_name} {md5}")
                print(f"正在处理文件: {file_path}")
                print(f"计算得到的 MD5 值为: {md5}")
                print(f"已生成对应的.md5.txt 文件: {output_file}")
                print("-" * 30)
            else:
                if os.path.isdir(file_path):
                    continue
                print(f"跳过文件: {file_name}，因其对应的.md5.txt 文件已存在")
                print("-" * 30)

def calculate_md5(file_path):
    """
    计算文件的 MD5 值

    参数：
    file_path (str): 文件的路径

    返回：
    str: 文件的 MD5 值
    """
    md5 = hashlib.md5()
    with open(file_path, 'rb') as file:
        for line in file:
            md5.update(line)
    return md5.hexdigest()

batch_calculate_md5(dir)
