运维日志您现在的位置是:首页 > 博客日志 > 运维日志

如何使用 python 遍历所有子目录,并删除目录下重复的文件

<a href='mailto:'>微wx笑</a>的头像微wx笑 2025-09-06运维日志 0 0关键字: python  

给定一个根目录,如何使用 python 遍历所有子目录,并删除目录下重复的文件,比如下面的文件名带(1)或(2)等的都是重复的:课标通用中考语文总复习第1部分专题1名句默写课件201904051197

给定一个根目录,如何使用 python 遍历所有子目录,并删除目录下重复的文件,比如下面的文件名带(1)或(2)等的都是重复的:
4rW无知

课标通用中考语文总复习第1部分专题1名句默写课件201904051197(1).pptx 课标通用中考语文总复习第1部分专题1名句默写课件201904051197(2).pptx 课标通用中考语文总复习第1部分专题1名句默写课件201904051197.pptx 课标通用中考语文总复习第1部分专题2语段综合课件201904051196(1).pptx 课标通用中考语文总复习第1部分专题2语段综合课件201904051196(2).pptx 课标通用中考语文总复习第1部分专题2语段综合课件201904051196.pptx 课标通用中考语文总复习第1部分专题3名著导读课件201904051195(1).pptx 课标通用中考语文总复习第1部分专题3名著导读课件201904051195(2).pptx 课标通用中考语文总复习第1部分专题3名著导读课件201904051195.pptx 课标通用中考语文总复习第1部分专题4语文综合运用课件201904051194(1).pptx 课标通用中考语文总复习第1部分专题4语文综合运用课件201904051194(2).pptx 课标通用中考语文总复习第1部分专题4语文综合运用课件201904051194.pptx4rW无知


4rW无知

import os
import sys
import re
import argparse

def find_duplicate_files(root_dir, dry_run=True):
    """
    遍历目录树,找出所有带有数字编号的重复文件
    """
    
    deleted_count = 0
    
    # 正则表达式匹配文件名中的数字编号部分
    pattern = re.compile(r'(.*?)(\s*\(\d+\))(\.\w+)$')
    
    # 遍历所有目录和文件
    for dirpath, _, filenames in os.walk(root_dir):
        print(f"\n当前目标: {dirpath}")
        
        for filename in filenames:
            print(f"\nfilename: {filename}")
            # 尝试匹配带数字编号的文件名模式
            match = pattern.match(filename)
            if match:
                # 提取基础文件名(不含编号部分)
                base_name = match.group(1) + match.group(3)
                full_path = os.path.join(dirpath, filename)
                print(f"\nbase_name: {base_name}")
                print(f"\nfull_path: {full_path}")
                if base_name in filenames:
                    print(f"\n文件存在: {base_name}")
                    if dry_run:
                        print(f"\n[模拟] 将删除: {full_path}")
                    else:
                        try:
                            os.remove(full_path)
                            print(f"\n已删除: {full_path}")
                            deleted_count += 1
                        except Exception as e:
                            print(f"\n删除失败 {full_path}: {e}")
                # sys.exit()
    return deleted_count


def main():
    parser = argparse.ArgumentParser(description='删除带数字编号的重复文件')
    parser.add_argument('root_dir', help='要处理的根目录路径')
    parser.add_argument('--execute', action='store_true', 
                       help='实际执行删除操作(默认是模拟运行)')
    
    args = parser.parse_args()
    
    if not os.path.isdir(args.root_dir):
        print(f"错误: {args.root_dir} 不是一个有效的目录")
        return
    
    print("正在搜索重复文件..." if not args.execute else "正在搜索并删除重复文件...")
    
    # 查找并处理重复文件
    deleted_count = find_duplicate_files(args.root_dir, dry_run=not args.execute)
    
    if args.execute:
        print(f"\n操作完成! 共删除了 {deleted_count} 个文件")
    else:
        print(f"\n模拟运行完成! 共找到 {deleted_count} 个待删除文件")
        print("使用 --execute 参数实际执行删除操作")

if __name__ == "__main__":
    main()

使用说明

  1. 将上述代码保存为 remove_duplicates.py4rW无知

  2. 通过命令行运行脚本:4rW无知

# 模拟运行(只显示将要删除的文件,不实际删除)
python remove_duplicates.py /path/to/your/root/directory

# 实际执行删除操作
python remove_duplicates.py /path/to/your/root/directory --execute

功能说明

  • 脚本会递归遍历指定根目录下的所有子目录4rW无知

  • 识别文件名中包含 (1)(2) 等数字编号的文件4rW无知

  • 如果原始文件(无编号版本)存在,则删除所有带编号的副本4rW无知

  • 如果原始文件不存在,则保留编号最小的文件,删除其他副本,并尝试将保留的文件重命名为原始名称4rW无知

  • 默认情况下为模拟运行模式,添加 --execute 参数后才实际执行删除操作4rW无知

注意事项

  1. 运行前请确保备份重要文件4rW无知

  2. 首次运行时建议使用模拟模式(不加 --execute 参数)查看将要执行的操作4rW无知

  3. 脚本只会处理文件名模式匹配的文件,不会比较文件内容4rW无知

使用此脚本前,请务必确认您了解它将执行的操作,并在重要数据上做好备份。4rW无知


4rW无知

程序中的 “# sys.exit()”我添加了注释;4rW无知

在调试的时候可以把注释去掉方便调试;4rW无知

本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/service/2025-09-06/2123.html

很赞哦! () 有话说 ()