Python/이것저것 파이썬

(서브 폴더 포함) 전체 파일 해시 추출

컴닥 2022. 10. 28. 09:57
반응형

[Q] 폴더와 파일 이름과 용량 등을 비교하여 파일 매칭을 해야하는데요.
네트워크로는 공유가 안되고 복사하기엔 용량이 너무 큰 상태입니다.

-------------------------------

[A] 각 PC에서, 파일 패스, 파일 사이즈, 해시값을 출력한 뒤
이 값들을 비교하는 게 좋을 것 같습니다. 

해시의 원리상
같은 파일일 경우 해시 값은 항상 같습니다.
다른 파일일 경우 해시 값이 같을 확률이 아주 약간 있습니다만, 
파일 크기까지 비교한다면 그 확률을 더 줄일 수 있습니다. 

import os
import hashlib


def check_dir(path):
    for root, _, files in os.walk(path):
        for file in files:
            joined_path = os.path.join(root, file)
            with open(joined_path, 'rb') as f:
                print(
                    hashlib.md5(f.read()).hexdigest(),
                    os.path.getsize(joined_path),
                    joined_path
                )


check_dir('c:/')

간단히 print문으로 코딩했지만, 
csv 등으로 출력 후 pandas, sqlite 또는 액셀을 사용한다면
더 빠르게 처리할 수 있을 겁니다. 

import os
import hashlib
import csv


def check_dir(path):
    with open('path_md5.csv', 'w', newline='') as csv_f:
        csv_writer = csv.writer(csv_f)
        for root, _, files in os.walk(path):
            for file in files:
                joined_path = os.path.join(root, file)
                print(joined_path)
                with open(joined_path, 'rb') as f:
                    csv_writer.writerow([hashlib.md5(f.read()).hexdigest(),
                                         os.path.getsize(joined_path),
                                         joined_path])


check_dir('c:/')

만약 이런 일을 반복적으로 해야한다면..
Git 같은 버전 관리 시스템이나,
백업 솔루션 등을 고려해 봐야겠지요... 

 

반응형