본문 바로가기
/Technology

[Python] compareDirs.py v0.1

by Donk 2011. 12. 27.
설명:
두 디렉토리가 같은 구조를 갖고 같은 파일들이 있는지를 비교해주는 파이썬 코드.
파일의 비교는 md5sum을 갖고 비교.
메모리 문제와 속도 문제로 파일의 md5sum을 계산 시에는 1GB씩 읽어오는 방식 이용.

사용법: ./compareDirs.py [directory1] [directory2]

다운로드:  compareDirs.py

소스코드:

#!/usr/bin/python

import os, sys, stat, hashlib


# Check arguments

if len(sys.argv) != 3:

  print 'Usage: ./compareDirs.py [Directory] [Directory]'

  sys.exit(0)


# Variables

BLOCK_SIZE = 1024000000 

dir1 = sys.argv[1]

dir2 = sys.argv[2]


# Iterate over files

for rootdir, subdirs, files in os.walk(dir1):

    for filename in files:

      pathname1 = os.path.join(rootdir, filename)

      pathname2 = os.path.join(rootdir.replace(dir1, dir2, 1), filename)


      if not os.path.exists(pathname2):

        print pathname2 + ' does not exist.'

        continue


      print 'Compare ' + pathname1 + ' and ' + pathname2


      # Regular file only

      if stat.S_ISREG(os.stat(pathname1).st_mode):

        if stat.S_ISREG(os.stat(pathname2).st_mode):

          f1 = open(pathname1, 'rb')

          f2 = open(pathname2, 'rb')


          # Compute MD5 by reading 8192-byte blocks

          f1_md5 = hashlib.md5()

          f2_md5 = hashlib.md5()


          while True:

            block = f1.read(BLOCK_SIZE)

            if not block:

              break

            f1_md5.update(block)


          while True:

            block = f2.read(BLOCK_SIZE)

            if not block:

              break

            f2_md5.update(block)

      

          # print f1_md5.digest()

          # print f2_md5.digest()

          if f1_md5.digest() != f2_md5.digest():

            print '\tDifferent.'

          else:

            print '\tSame.'



 

댓글