Я написал сценарий для этого некоторое время назад.Сначала он сканирует все файлы, отмечая их размеры в словаре.В итоге вы набираете:
images[some_size] = ['x/a.jpg', 'b/f.jpg', 'n/q.jpg']
images[some_other_size] = ['q/b.jpg']
Затем для каждого ключа (размера изображения), где в словаре более одного элемента, я бы прочитал некоторый фиксированный объем файла и сделал бы хэш.Что-то вроде:
possible_dupes = [size for size in images if len(images[size]) > 1]
for size in possible_dupes:
hashes = defaultdict(list)
for fname in images[size]:
m = md5.new()
hashes[ m.update( file(fname,'rb').read(10000) ).digest() ] = fname
for k in hashes:
if len(hashes[k]) <= 1: continue
for fname in hashes[k][1:]:
os.remove(fname)
Это все из головы, не проверял код, но вы поняли.