1

我有一组包含n许多文件的目录,我需要比较每个文件(在一个目录中)并找出它们是否有任何区别。我试过了filecmpdifflib但它们只支持两个文件。

我还能做些什么来比较/区分文件吗?

此文件包含主机名

--------------------------------
Example :- Dir -> Server.1
                    |-> file1
                    |-> file2
                    |-> file3


file1 <- host1 
         host2
         host3

file2 <- host1 
         host2 
         host3 
         host4

file3 <- host1 
         host2 
         host3
4

2 回答 2

2

我想我会分享将 md5 哈希比较与 os.path.walk() 相结合如何帮助您找出目录树中的所有重复项。目录和文件的数量越大,首先按大小对文件进行排序以排除任何由于大小不同而无法重复的文件可能会更有帮助。希望这可以帮助。

import os, sys
from hashlib import md5

nonDirFiles = []

def crawler(arg, dirname, fnames):
    '''Crawls directory 'dirname' and creates global 
    list of paths (nonDirFiles) that are files, not directories'''
    d = os.getcwd()
    os.chdir(dirname)

    global nonDirFiles
    for f in fnames:
        if not os.path.isfile(f):

            continue
        else:       
            nonDirFiles.append(os.path.join(dirname, f))
    os.chdir(d)

def startCrawl():
    x = raw_input("Enter Dir: ")
    print 'Scanning directory "%s"....' %x
    os.path.walk(x, crawler, nonDirFiles)

def findDupes():
    dupes = []
    outFiles = []
    hashes = {}
    for fileName in nonDirFiles:
        print 'Scanning file "%s"...' % fileName
        f = file(fileName, 'r')
        hasher = md5()
        data = f.read()
        hasher.update(data)
        hashValue = hasher.digest()

        if hashes.has_key(hashValue):

            dupes.append(fileName)
        else:
            hashes[hashValue] = fileName

    return dupes

if __name__ == "__main__":
    startCrawl()
    dupes = findDupes()
    print "These files are duplicates:"
    for d in dupes:print d
于 2012-12-12T23:13:19.183 回答
1

您的问题没有指定您是否需要确定差异或仅查找哪些文件相同/不同 - 所以我将专注于将文件分组在一起。

您可以使用散列将相同的文件组合在一起:

from hashlib import md5
from pprint import pprint

def get_filenames():
    return ('file1', 'file2', 'file3')

hashes = {}
for f in get_filenames():
    hd = md5(open(f).read()).hexdigest()
    hashes[hd] = hashes.get(hd, []) + [f]

pprint(hashes)
{'420248eb2e8226ac441cb7516fb7ff23': ['file2'],
 '4f2d7139dc1aa23235e7fad418a5bd10': ['file1', 'file3']}

鉴于您的文件包含主机名列表,您可能希望事先对文件进行排序,例如,

file1 <- host1 
         host2
         host3

file3 <- host3 
         host2
         host1

被认为是等效的。

于 2012-09-18T13:58:38.337 回答