如何使用 python 遍历所有子目录,并删除目录下重复的文件
微wx笑
2025-09-06【运维日志】
1
0关键字:
python
给定一个根目录,如何使用 python 遍历所有子目录,并删除目录下重复的文件,比如下面的文件名带(1)或(2)等的都是重复的:课标通用中考语文总复习第1部分专题1名句默写课件201904051197
给定一个根目录,如何使用 python 遍历所有子目录,并删除目录下重复的文件,比如下面的文件名带(1)或(2)等的都是重复的:
课标通用中考语文总复习第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.pptx
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()使用说明
将上述代码保存为
remove_duplicates.py通过命令行运行脚本:
# 模拟运行(只显示将要删除的文件,不实际删除) python remove_duplicates.py /path/to/your/root/directory # 实际执行删除操作 python remove_duplicates.py /path/to/your/root/directory --execute
功能说明
脚本会递归遍历指定根目录下的所有子目录
识别文件名中包含
(1),(2)等数字编号的文件如果原始文件(无编号版本)存在,则删除所有带编号的副本
如果原始文件不存在,则保留编号最小的文件,删除其他副本,并尝试将保留的文件重命名为原始名称
默认情况下为模拟运行模式,添加
--execute参数后才实际执行删除操作
注意事项
运行前请确保备份重要文件
首次运行时建议使用模拟模式(不加
--execute参数)查看将要执行的操作脚本只会处理文件名模式匹配的文件,不会比较文件内容
使用此脚本前,请务必确认您了解它将执行的操作,并在重要数据上做好备份。
程序中的 “# sys.exit()”我添加了注释;
在调试的时候可以把注释去掉方便调试;
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/service/2025-09-06/2123.html



