【发布时间】:2013-09-10 16:33:36
【问题描述】:
我知道以前有人问过这个问题,并且我已经看到了一些答案,但是这个问题更多的是关于我的代码和完成这项任务的最佳方式。
我想扫描一个目录并查看该目录中是否有任何重复项(通过检查 MD5 哈希)。以下是我的代码:
import sys
import os
import hashlib
fileSliceLimitation = 5000000 #bytes
# if the file is big, slice trick to avoid to load the whole file into RAM
def getFileHashMD5(filename):
retval = 0;
filesize = os.path.getsize(filename)
if filesize > fileSliceLimitation:
with open(filename, 'rb') as fh:
m = hashlib.md5()
while True:
data = fh.read(8192)
if not data:
break
m.update(data)
retval = m.hexdigest()
else:
retval = hashlib.md5(open(filename, 'rb').read()).hexdigest()
return retval
searchdirpath = raw_input("Type directory you wish to search: ")
print ""
print ""
text_file = open('outPut.txt', 'w')
for dirname, dirnames, filenames in os.walk(searchdirpath):
# print path to all filenames.
for filename in filenames:
fullname = os.path.join(dirname, filename)
h_md5 = getFileHashMD5 (fullname)
print h_md5 + " " + fullname
text_file.write("\n" + h_md5 + " " + fullname)
# close txt file
text_file.close()
print "\n\n\nReading outPut:"
text_file = open('outPut.txt', 'r')
myListOfHashes = text_file.read()
if h_md5 in myListOfHashes:
print 'Match: ' + " " + fullname
这给了我以下输出:
Please type in directory you wish to search using above syntax: /Users/bubble/Desktop/aF
033808bb457f622b05096c2f7699857v /Users/bubble/Desktop/aF/.DS_Store
409d8c1727960fddb7c8b915a76ebd35 /Users/bubble/Desktop/aF/script copy.py
409d8c1727960fddb7c8b915a76ebd25 /Users/bubble/Desktop/aF/script.py
e9289295caefef66eaf3a4dffc4fe11c /Users/bubble/Desktop/aF/simpsons.mov
Reading outPut:
Match: /Users/bubble/Desktop/aF/simpsons.mov
我的想法是:
1) 扫描目录 2)将MD5哈希+文件名写入文本文件 3) 以只读方式打开文本文件 4) 再次扫描目录并检查文本文件...
我发现这不是一个好方法,而且它不起作用。 “匹配”只是打印出最后处理的文件。
我怎样才能让这个脚本真正找到重复项?有人可以告诉我完成这项任务的更好/更简单的方法。
非常感谢您的帮助。抱歉,这篇文章很长。
【问题讨论】:
-
其实比较MD5比逐字节比较文件要慢(文件每个字节1个周期)。我很确定 MD5 每个字节需要一个以上的周期。我建议你只是从文件中读取固定数量的字节并不断比较,这样会更简单更快。
-
@RamchandraApte,但是将每个文件与其他文件进行比较很慢。使用 MD5 可以帮助避免这种情况。
-
@senderle 你是对的。但是简单地比较每个文件的前几个字节和最后几个字节可能会更快,然后如果匹配则比较整个文件。
-
要真正加快速度,首先按文件大小对文件进行分组,然后仅在组内进行比较。除非文件大小相同有什么奇怪的原因,否则大多数文件都会有唯一的文件大小,并且永远不需要扫描。
标签: python file duplicates hashlib