今天跟大家伙儿聊聊我最近搞的一个小玩意儿,我自己叫它“重复文件查找王”。这名字听着霸气,就是个小脚本,但解决了我一个大烦恼!
事情是这样的,我这电脑用久了,各种文件乱七八糟,照片、视频、文档,啥都有。时间一长,我自己都不知道哪些是重复的,硬盘空间眼看着越来越少,这可不行!
我也想着用现成的软件,网上搜了一堆,像啥“文件管家”、“文件全能王”之类的,下载了好几个试了试,要么广告太多,要么扫描速度慢得要死,要么就是界面复杂,用起来不顺手。我一咬牙,寻思着自己撸一个!
说干就干!我先捋了捋思路,这重复文件查找,核心就是比较文件嘛最简单的方法就是比较文件名,但文件名一样的,内容不一定一样。还得比较文件大小,如果文件名和大小都一样,那基本上就是重复的了。但是,为了更保险,还得加上校验值,比如MD5或者SHA1,这样才能确保万无一失。
我选了Python,这玩意儿用起来方便,库也多。我写了个函数,用来遍历指定目录下的所有文件。这步很简单, 一把梭!
import os
def get_all_files(dir_path):
file_list = []
for root, dirs, files in *(dir_path):
for file in files:
file_path = *(root, file)
file_*(file_path)
return file_list
然后,我写了个函数,用来计算文件的MD5值。这也不难,打开文件,读取内容,然后用hashlib
算一下就行了。
import hashlib
def calculate_md5(file_path):
with open(file_path, 'rb') as f:
md5_obj = *5()
while True:
chunk = *(4096)
if not chunk:
break
md5_*(chunk)
return md5_*()
有了这两个函数,接下来就好办了。我先遍历所有文件,把文件名、大小、MD5值都存到一个字典里。然后,再遍历一遍,比较文件名和大小,如果一样,就比较MD5值,如果MD5值也一样,那就肯定是重复文件了!
def find_duplicate_files(dir_path):
file_dict = {}
all_files = get_all_files(dir_path)
for file_path in all_files:
file_name = *(file_path)
file_size = *(file_path)
file_md5 = calculate_md5(file_path)
key = (file_name, file_size)
if key in file_dict:
file_dict[key].append((file_path, file_md5))
else:
file_dict[key] = [(file_path, file_md5)]
duplicate_files = []
for key, value in file_*():
if len(value) > 1:
md5_set = set()
for file_path, file_md5 in value:
if file_md5 in md5_set:
duplicate_*(file_path)
else:
md5_*(file_md5)
return duplicate_files
我写了个主函数,调用上面的函数,把重复文件打印出来,或者直接删除。为了安全起见,我一开始没敢直接删除,只是打印出来,让我自己确认一下。
if __name__ == '__main__':
dir_path = input("请输入要查找的目录:")
duplicate_files = find_duplicate_files(dir_path)
if duplicate_files:
print("找到以下重复文件:")
for file_path in duplicate_files:
print(file_path)
else:
print("没有找到重复文件。")
跑了一下,效果还真不错!我一下子找到了好多重复的照片和视频,都是以前备份的时候没注意,搞重复了。手动删了一部分,硬盘空间立马就释放出来了!
这个小脚本还有很多可以改进的地方。比如,可以加上图形界面,方便操作;可以支持更多的校验算法,提高准确性;还可以支持断点续扫,避免扫描大目录时中断。以后有空了,再慢慢完善!
这回自己动手写“重复文件查找王”,还是很有成就感的。不仅解决了实际问题,还学到了不少东西。以后遇到类似的需求,也能更快地搞定了!