文件整理工具自动解压压缩包 全局去重功能说明递归遍历指定目录自动解压.zip/.rar/.7z压缩包到同级目录同名文件自动对比保留一份遍历全部文件通过文件哈希MD5精准识别重复文件只保留原始文件其余重复文件移动到备份目录自动生成重复文件清单报表重复文件清单.csv记录原始文件、重复文件、文件大小、MD5兼容 Windows / Mac / Linux依赖解压工具自动适配完整代码importosimporthashlibimportshutilimportcsvimportsubprocessfrompathlibimportPath# 配置区自行修改 TARGET_ROOTrD:/TestFile# 需要整理的根目录BACKUP_DIRPath(TARGET_ROOT)/重复文件备份# 重复文件存放备份文件夹SUPPORT_COMPRESS{.zip,.rar,.7z}# 支持解压的压缩格式CHUNK_SIZE65536# MD5读取分块大小避免大文件内存溢出# defget_file_md5(file_path:Path)-str:计算文件MD5哈希值用于判断文件是否完全相同md5_objhashlib.md5()try:withopen(file_path,rb)asf:whilechunk:f.read(CHUNK_SIZE):md5_obj.update(chunk)returnmd5_obj.hexdigest()exceptExceptionase:print(f[MD5计算失败]{file_path}| 错误:{str(e)})returndefsafe_merge_file(src:Path,dst:Path):解压时遇到同名文件MD5对比相同则删除源不同则重命名ifnotdst.exists():shutil.move(src,dst)returnsrc_md5get_file_md5(src)dst_md5get_file_md5(dst)ifsrc_md5dst_md5:# 文件完全一致直接删除解压出来的重复文件os.remove(src)print(f[解压去重] 文件完全相同删除解压临时文件:{src.name})else:# 文件内容不同重命名解压文件避免覆盖new_namef{src.stem}_副本{src.suffix}new_dstsrc.parent/new_name shutil.move(src,new_dst)print(f[解压冲突] 同名内容不同重命名为:{new_name})defextract_compress(file_path:Path):解压压缩包到同级目录自动处理同名文件extfile_path.suffix.lower()parent_dirfile_path.parentprint(f\n[开始解压]{file_path})try:ifext.zip:importzipfilewithzipfile.ZipFile(file_path,r)aszf:fornameinzf.namelist():extract_pathparent_dir/name zf.extract(name,parent_dir)ifextract_path.is_file():safe_merge_file(extract_path,extract_path)elifextin(.rar,.7z):# 调用7z命令行解压Windows自带7-Zip需配置环境变量Linux/Mac安装p7zip-fullcmd[7z,x,-y,f-o{parent_dir},str(file_path)]subprocess.run(cmd,capture_outputTrue,textTrue)# 遍历解压生成的所有文件做同名去重forroot,_,filesinos.walk(parent_dir):forfnameinfiles:fpathPath(root)/fnameiffpath.stat().st_ctimefile_path.stat().st_ctime:safe_merge_file(fpath,fpath)print(f[解压完成]{file_path.name})exceptExceptionase:print(f[解压失败]{file_path}| 错误:{str(e)})deftraverse_and_extract(root:Path):递归遍历目录解压所有压缩包compress_files[]# 先收集所有压缩文件避免遍历中目录变动漏文件forroot_dir,_,filesinos.walk(root):forfnameinfiles:fpathPath(root_dir)/fnameiffpath.suffix.lower()inSUPPORT_COMPRESS:compress_files.append(fpath)# 依次解压forcomp_fileincompress_files:extract_compress(comp_file)deffind_duplicate_files(root:Path):全局扫描所有文件找出重复文件返回重复字典 md5:[原始文件, 重复文件列表]md5_map{}duplicate_records[]# 遍历所有文件forroot_dir,_,filesinos.walk(root):forfnameinfiles:fpathPath(root_dir)/fname# 跳过备份文件夹、压缩包如需保留压缩包可删除此判断ifBACKUP_DIRinfpath.parentsorfpath.suffix.lower()inSUPPORT_COMPRESS:continuefile_md5get_file_md5(fpath)ifnotfile_md5:continuefile_sizefpath.stat().st_size record{path:str(fpath),size:file_size,md5:file_md5}iffile_md5notinmd5_map:md5_map[file_md5][record]else:md5_map[file_md5].append(record)# 筛选出存在重复的分组formd5,file_listinmd5_map.items():iflen(file_list)1:originfile_list[0]copiesfile_list[1:]forcopyincopies:duplicate_records.append({md5:md5,文件大小(字节):origin[size],原始保留文件:origin[path],重复待迁移文件:copy[path]})returnduplicate_recordsdefmove_duplicate_and_export_csv(duplicate_list):迁移重复文件到备份目录导出CSV清单BACKUP_DIR.mkdir(exist_okTrue)csv_pathPath(TARGET_ROOT)/重复文件清单.csvheaders[md5,文件大小(字节),原始保留文件,重复待迁移文件]withopen(csv_path,w,newline,encodingutf-8-sig)asf:writercsv.DictWriter(f,fieldnamesheaders)writer.writeheader()writer.writerows(duplicate_list)# 移动所有重复文件到备份目录foriteminduplicate_list:src_pathPath(item[重复待迁移文件])ifnotsrc_path.exists():continue# 构建备份内相同层级目录rel_pathsrc_path.relative_to(Path(TARGET_ROOT))dst_pathBACKUP_DIR/rel_path dst_path.parent.mkdir(parentsTrue,exist_okTrue)try:shutil.move(src_path,dst_path)print(f[重复文件迁移]{src_path}-{dst_path})exceptExceptionase:print(f[迁移失败]{src_path}|{str(e)})print(f\n重复文件清单已生成{csv_path})print(f所有重复文件备份目录{BACKUP_DIR})if__name____main__:root_pathPath(TARGET_ROOT)ifnotroot_path.exists():print(f错误目标目录不存在{TARGET_ROOT})else:print( 第一步解压目录下所有压缩包 )traverse_and_extract(root_path)print(\n 第二步全局扫描重复文件 )duplicatesfind_duplicate_files(root_path)ifnotduplicates:print(未找到任何重复文件)else:print(f共检测到{len(duplicates)}个重复文件)move_duplicate_and_export_csv(duplicates)print(\n文件整理全部完成)前置环境安装1. Python依赖pipinstallpy7zrunrar2. 解压工具依赖关键Windows安装7-Zip并把7z安装目录加入系统环境变量Linuxsudo apt install p7zip-full unrarMacbrew install p7zip unrar程序逻辑详解1. 压缩包解压处理递归扫描全部目录收集所有zip/rar/7z文件自动解压至压缩包同级文件夹解压出现同名文件时MD5比对文件完全相同 → 直接删除解压出来的副本文件名相同但内容不同 → 自动重命名防止覆盖丢失文件2. 全局重复文件清理使用MD5哈希比对文件而非仅文件名100%精准判断文件是否完全一致保留最先扫描到的原始文件其余重复文件统一移动到重复文件备份文件夹不会直接删除防止误操作自动还原原目录层级存放备份文件方便你手动恢复3. 报表输出根目录生成重复文件清单.csv可用Excel打开包含文件MD5标识文件大小保留的原始文件完整路径已迁移的重复文件完整路径使用方法修改代码顶部TARGET_ROOT为你需要整理的文件夹路径安装依赖与解压工具直接运行脚本执行顺序先解压全部压缩包 → 扫描全部重复文件 → 迁移重复文件 导出清单安全说明不会直接删除任何文件重复文件全部移动到备份文件夹确认无用后可手动删除解压同名文件不会覆盖原有文件内容不同会自动改名大文件采用分块读取MD5不会占用大量内存支持几十GB大文件CSV使用utf-8-sig编码Excel打开不乱码