import os,re
from itertools import combinations
#两两组合
def combinations_iterative(elements):
return list(combinations(elements, 2))
#将按照字符串长度升序排列
def sort_by_length(lst):
# 定义一个自定义排序函数,按字符串长度排序
def length_sort(item):
return len(item)
# 使用 sorted 函数对列表进行排序,按照字符串长度升序排列
return sorted(lst, key=length_sort)
#第一轮遍历文件
def build_file_dict(folder_path):
file_dict = {}
# 遍历文件夹中的所有文件
for root, dirs, files in os.walk(folder_path):
for file_name in files:
# 获取文件的完整路径
file_path = os.path.join(root, file_name)
# 获取文件的体积
file_size = os.path.getsize(file_path)//1024
# 获取文件的基础名和扩展名
base_name, extension = os.path.splitext(file_name)
# 如果文件体积已经在字典中
if file_size in file_dict:
# 如果文件扩展名已经在内部字典中
if extension in file_dict[file_size]:
# 将文件基础名添加到对应的列表中
file_dict[file_size][extension].append(base_name)
else:
# 创建新的扩展名列表,并添加基础名
file_dict[file_size][extension] = [base_name]
else:
# 创建新的内部字典,并添加扩展名和基础名
file_dict[file_size] = {extension: [base_name]}
return file_dict
# 查找重复的文件 并删除
def find_duplicate_files(file_dict):
for k,v in file_dict.items():
for k2,v2 in v.items():
duplicate_files=set() #疑似重复
existing_files=set()
result=combinations_iterative(v2) #两两组合
for comp in result:
temp=sort_by_length(comp)
if len(temp[0])!=len(temp[1]):
match = re.match(r'(.*)\((\d+)\)', temp[1])
if match:
if match.group(1)==temp[0]:
duplicate_files.add(temp[1])
existing_files.add(temp[0])
if len(duplicate_files)>0:
print(existing_files)
print(duplicate_files)
for dd in duplicate_files:
file_path=os.path.join(folder_path, dd+k2)
# 获取当前权限
current_permissions = os.stat(file_path).st_mode
# 移除只读权限
os.chmod(file_path, current_permissions | 0o222)
print(f"删除副本文件:{file_path}")
os.remove(file_path)
print('-'*5)
# 遍历所有的子文件夹
def find_direct_subdirectories(folder):
subdirectories = []
# 使用 os.listdir() 函数获取文件夹下的所有项
items = os.listdir(folder)
# 遍历每个项,筛选出子文件夹
for item in items:
item_path = os.path.join(folder, item)
if os.path.isdir(item_path):
subdirectories.append(item_path)
return subdirectories
folder_patha = r"F:\微信文件备份\WeChat Files\kcjevin\FileStorage\File"
subdirs = find_direct_subdirectories(folder_patha)
print("直接子文件夹列表:")
for subdir in subdirs:
print(subdir)
folder_path = subdir # 替换为你的文件夹路径
file_dict = build_file_dict(folder_path)
# print(file_dict)
find_duplicate_files(file_dict)