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

【自编工具】文件整理工具:自动解压压缩包 + 全局去重

文件整理工具:自动解压压缩包 + 全局去重

功能说明:

  1. 递归遍历指定目录,自动解压.zip/.rar/.7z压缩包到同级目录,同名文件自动对比保留一份
  2. 遍历全部文件,通过文件哈希MD5精准识别重复文件,只保留原始文件,其余重复文件移动到备份目录
  3. 自动生成重复文件清单报表(重复文件清单.csv),记录原始文件、重复文件、文件大小、MD5
  4. 兼容 Windows / Mac / Linux,依赖解压工具自动适配

完整代码

importosimporthashlibimportshutilimportcsvimportsubprocessfrompathlibimportPath# ===================== 配置区(自行修改) =====================TARGET_ROOT=r"D:/TestFile"# 需要整理的根目录BACKUP_DIR=Path(TARGET_ROOT)/"重复文件备份"# 重复文件存放备份文件夹SUPPORT_COMPRESS={".zip",".rar",".7z"}# 支持解压的压缩格式CHUNK_SIZE=65536# MD5读取分块大小,避免大文件内存溢出# ==========================================================defget_file_md5(file_path:Path)->str:"""计算文件MD5哈希值,用于判断文件是否完全相同"""md5_obj=hashlib.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)}")return""defsafe_merge_file(src:Path,dst:Path):"""解压时遇到同名文件,MD5对比,相同则删除源,不同则重命名"""ifnotdst.exists():shutil.move(src,dst)returnsrc_md5=get_file_md5(src)dst_md5=get_file_md5(dst)ifsrc_md5==dst_md5:# 文件完全一致,直接删除解压出来的重复文件os.remove(src)print(f"[解压去重] 文件完全相同,删除解压临时文件:{src.name}")else:# 文件内容不同,重命名解压文件避免覆盖new_name=f"{src.stem}_副本{src.suffix}"new_dst=src.parent/new_name shutil.move(src,new_dst)print(f"[解压冲突] 同名内容不同,重命名为:{new_name}")defextract_compress(file_path:Path):"""解压压缩包到同级目录,自动处理同名文件"""ext=file_path.suffix.lower()parent_dir=file_path.parentprint(f"\n[开始解压]{file_path}")try:ifext==".zip":importzipfilewithzipfile.ZipFile(file_path,"r")aszf:fornameinzf.namelist():extract_path=parent_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-full)cmd=["7z","x","-y",f"-o{parent_dir}",str(file_path)]subprocess.run(cmd,capture_output=True,text=True)# 遍历解压生成的所有文件做同名去重forroot,_,filesinos.walk(parent_dir):forfnameinfiles:fpath=Path(root)/fnameiffpath.stat().st_ctime>=file_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:fpath=Path(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:fpath=Path(root_dir)/fname# 跳过备份文件夹、压缩包(如需保留压缩包可删除此判断)ifBACKUP_DIRinfpath.parentsorfpath.suffix.lower()inSUPPORT_COMPRESS:continuefile_md5=get_file_md5(fpath)ifnotfile_md5:continuefile_size=fpath.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:origin=file_list[0]copies=file_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_ok=True)csv_path=Path(TARGET_ROOT)/"重复文件清单.csv"headers=["md5","文件大小(字节)","原始保留文件","重复待迁移文件"]withopen(csv_path,"w",newline="",encoding="utf-8-sig")asf:writer=csv.DictWriter(f,fieldnames=headers)writer.writeheader()writer.writerows(duplicate_list)# 移动所有重复文件到备份目录foriteminduplicate_list:src_path=Path(item["重复待迁移文件"])ifnotsrc_path.exists():continue# 构建备份内相同层级目录rel_path=src_path.relative_to(Path(TARGET_ROOT))dst_path=BACKUP_DIR/rel_path dst_path.parent.mkdir(parents=True,exist_ok=True)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_path=Path(TARGET_ROOT)ifnotroot_path.exists():print(f"错误:目标目录不存在{TARGET_ROOT}")else:print("===== 第一步:解压目录下所有压缩包 =====")traverse_and_extract(root_path)print("\n===== 第二步:全局扫描重复文件 =====")duplicates=find_duplicate_files(root_path)ifnotduplicates:print("未找到任何重复文件!")else:print(f"共检测到{len(duplicates)}个重复文件")move_duplicate_and_export_csv(duplicates)print("\n文件整理全部完成!")

前置环境安装

1. Python依赖

pipinstallpy7zrunrar

2. 解压工具依赖(关键)

  • Windows:安装7-Zip,并把7z安装目录加入系统环境变量
  • Linux:sudo apt install p7zip-full unrar
  • Mac:brew install p7zip unrar

程序逻辑详解

1. 压缩包解压处理

  1. 递归扫描全部目录,收集所有zip/rar/7z文件
  2. 自动解压至压缩包同级文件夹
  3. 解压出现同名文件时:
    • MD5比对,文件完全相同 → 直接删除解压出来的副本
    • 文件名相同但内容不同 → 自动重命名,防止覆盖丢失文件

2. 全局重复文件清理

  1. 使用MD5哈希比对文件,而非仅文件名,100%精准判断文件是否完全一致
  2. 保留最先扫描到的原始文件,其余重复文件统一移动到重复文件备份文件夹(不会直接删除,防止误操作)
  3. 自动还原原目录层级存放备份文件,方便你手动恢复

3. 报表输出

根目录生成重复文件清单.csv,可用Excel打开,包含:

  • 文件MD5标识
  • 文件大小
  • 保留的原始文件完整路径
  • 已迁移的重复文件完整路径

使用方法

  1. 修改代码顶部TARGET_ROOT为你需要整理的文件夹路径
  2. 安装依赖与解压工具
  3. 直接运行脚本
  4. 执行顺序:先解压全部压缩包 → 扫描全部重复文件 → 迁移重复文件 + 导出清单

安全说明

  1. 不会直接删除任何文件,重复文件全部移动到备份文件夹,确认无用后可手动删除
  2. 解压同名文件不会覆盖原有文件,内容不同会自动改名
  3. 大文件采用分块读取MD5,不会占用大量内存,支持几十GB大文件
  4. CSV使用utf-8-sig编码,Excel打开不乱码
http://www.jsqmd.com/news/1103408/

相关文章:

  • 最后一次刷卡——替不会说话的东西办退休
  • 国网项目验收必看:功能、非功能、安全、渗透测试一站式办理指南!
  • 5分钟拯救B站收藏:如何用开源工具实现m4s视频永久备份?
  • 第一章Netty,ByteBuffer大小分配问题
  • 哪有什么免费的午餐?阿贝云免费主机入坑指南
  • ICM-42688-P与STM32L021K4在运动控制与工业监测中的应用
  • Smithbox免费开源游戏修改工具:魂系游戏Mod制作的终极指南
  • 如何快速搭建网易云音乐API服务:终极配置与开发指南
  • AMD Ryzen处理器免费调试神器:5分钟学会SMU Debug Tool完整指南
  • ncmdumpGUI:免费解锁网易云音乐加密NCM文件的终极Windows图形界面解决方案
  • DouyinLiveRecorder:一站式多平台直播录制解决方案,支持40+平台自动录制
  • Windows 10 环境下 Docker 部署 Sub2API 完整教程(避坑版)
  • 解决一个操作系统两个Java版本的问题
  • GPT 应用场景全解析:从代码编写到技术文档,AI 到底能帮你做什么?
  • 终极指南:如何轻松实现Switch与WiiU《塞尔达传说》存档自由转换
  • 三步掌握pywencai:Python高效获取同花顺问财数据的实战指南
  • BurpSuite API发现插件实战:自动化侦察与越权漏洞挖掘
  • GNSS定位与LTE Cat 1的嵌入式硬件实现方案
  • 2026 程序员 AI 兵器谱:Cursor vs GitHub Copilot vs 通义灵码 vs CodeBuddy 深度横评
  • ScratchJr桌面版:儿童编程启蒙的终极完整指南
  • iOS 混编提交苹果 Appstore 流程详解
  • 大厂是怎么监控 Java 项目的 01
  • 查英文论文时,谷歌学术入口、SCI文献和DOI信息可以这样配合使用
  • 安全测试实战:OWASP Top 10漏洞检测与防御全覆盖
  • 2026 东莞阻尼转轴 旋转合页厂家 TOP10 完整榜单|细分赛道实力排名 + 选型指南
  • Python+AI零基础到高薪就业:2026最新实战学习路径(建议收藏)
  • Linux 远程连接实操|SSH、Xshell 与 Xftp 使用笔记
  • 5步打造高效插件:Notepad--扩展开发实战指南
  • 终极指南:如何使用pywencai快速获取同花顺问财结构化数据
  • 2026年最新AI短剧保姆级制作教程