この質問は以前に尋ねられたことを知っており、いくつかの回答を見てきましたが、この質問は私のコードと、このタスクを達成するための最良の方法に関するものです。
ディレクトリをスキャンし、(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) ディレクトリを再度スキャンし、テキスト ファイルと照合する...
これは良い方法ではなく、機能しないことがわかります。「一致」は、処理された最後のファイルを出力するだけです。
このスクリプトで実際に重複を見つけるにはどうすればよいですか? 誰かがこのタスクを達成するためのより良い/より簡単な方法を教えてもらえますか.
助けてくれてありがとう。申し訳ありませんが、これは長い投稿です。