1

私はファイルの数を含むディレクトリのセットを持っていnます、私はそれらのファイルのそれぞれを(1つのディレクトリ内で)比較し、それらに違いがあるかどうかを見つける必要があります。試しましたが、2つのファイルしかサポートしていません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 に答える