그래서 일하기 싫어하는 엔지니어가 자동화 스크립트를 가져왔어!
folder1이랑 folder2랑 비교해서 파일들 해시값 리스트업 해주고
동일한 해시값끼리 묶어주는 스크립트임
난 개발자는 아니라서 gpt쟝한테 부탁해서 쓴 코드긴 한데
간단한 업무 자동화 하는 수준에서는 편하게 쓰기 좋더라
md5, sha1, sha256, sha512 해시값 총 네개를 비교해주고 엑셀파일로 떨궈줄거임
우선 비교 대상을 folder1, folder2에 각각 넣어주고
메모장을 켠 다음 맨 아래에 있는 코드 복사/붙여넣기 한 다음 filename.py로 이름 변경
폴더명은 필요하면 코드 수정해서 바꿔주면 되고
그 다음 파이썬3를 설치하고 cmd에서 아래 라이브러리를 설치해줘
파이썬 설치 링크
파이썬을 설치 했으면 폴더를 우클릭 한 다음 터미널에서 열기
그 다음 라이브러리 설치 아래 복붙하면 돼
pip install pandas openpyxl
그런 다음은 python ./filename.py
하면 따란
기계가 알아서 해시값을 구하고 비교까지 해서 나한테 갖다 바쳐줌
반복 노동은 기계한테 시키고 이제 우리는 저걸 가지고 저작권자한테 주기만 하면 됨
코드
##################################################
import os
import hashlib
import pandas as pd
from openpyxl import Workbook
from concurrent.futures import ThreadPoolExecutor, as_completed
def calculate_hashes(file_info):
folder_name, rel_path, full_path = file_info
hashes = {'sha256': hashlib.sha256(),
'sha1': hashlib.sha1(),
'md5': hashlib.md5(),
'sha512': hashlib.sha512()}
try:
with open(full_path, 'rb') as f:
while chunk := f.read(8192):
for h in hashes.values():
h.update(chunk)
return {
'folder': folder_name,
'filename': rel_path,
'sha256': hashes['sha256'].hexdigest(),
'sha1': hashes['sha1'].hexdigest(),
'md5': hashes['md5'].hexdigest(),
'sha512': hashes['sha512'].hexdigest(),
}
except Exception:
return {
'folder': folder_name,
'filename': rel_path,
'sha256': 'ERROR',
'sha1': 'ERROR',
'md5': 'ERROR',
'sha512': 'ERROR',
}
def gather_file_list(folder_name):
file_list = []
for root, _, files in os.walk(folder_name):
for file in files:
full_path = os.path.join(root, file)
rel_path = os.path.relpath(full_path, folder_name)
file_list.append((folder_name, rel_path, full_path))
return file_list
def main():
folders = ['folder1', 'folder2']
all_file_info = []
for folder in folders:
all_file_info.extend(gather_file_list(folder))
print(f"🔍 총 파일 수: {len(all_file_info)}개 - 해시 계산 중...")
results = []
with ThreadPoolExecutor() as executor:
futures = [executor.submit(calculate_hashes, fi) for fi in all_file_info]
for future in as_completed(futures):
results.append(future.result())
df = pd.DataFrame(results)
# 전체 해시 목록 Sheet2
sheet2 = df[['folder', 'filename', 'sha256', 'sha1', 'md5', 'sha512']]
# 중복 해시 비교 Sheet1 (sha256 기준)
folder1_hashes = df[df['folder'] == 'folder1']
folder2_hashes = df[df['folder'] == 'folder2']
duplicates = pd.merge(
folder1_hashes, folder2_hashes,
on='sha256', suffixes=('_f1', '_f2')
)
sheet1 = duplicates[['filename_f1', 'filename_f2', 'sha256', 'sha1_f1', 'md5_f1', 'sha512_f1']]
sheet1.columns = ['folder1', 'folder2', 'sha256', 'sha1', 'md5', 'sha512']
with pd.ExcelWriter('hash_comparison_parallel.xlsx', engine='openpyxl') as writer:
sheet1.to_excel(writer, sheet_name='Duplicates_SHA256', index=False)
sheet2.to_excel(writer, sheet_name='All_File_Hashes', index=False)
print("✅ 병렬 해시 비교 완료: hash_comparison_parallel.xlsx")
if __name__ == "__main__":
main()
(IP보기클릭)156.146.***.***
세상에 이젠 정크공구까지 나오잖아?!
(IP보기클릭)14.50.***.***
이 정도면 파묘가 아니라 그냥 굴삭기를 꺼내온거 아니냐
(IP보기클릭)121.182.***.***
뭔지 모르겠지만 제 가랑이 사이에 있는 파이톤도 빌려 드릴게요
(IP보기클릭)220.125.***.***
이런, 파이톤이 아니라 실뱀이었잖아!
(IP보기클릭)118.235.***.***
자신있으시다길래 파헤쳐드림 ㅋㅋㅋ
(IP보기클릭)112.187.***.***
??? : 하란다고 진짜 하는놈들이 나오네
(IP보기클릭)121.189.***.***
파이톤? 바베이도스실뱀으로 보이는데!
(IP보기클릭)156.146.***.***
세상에 이젠 정크공구까지 나오잖아?!
(IP보기클릭)121.182.***.***
뭔지 모르겠지만 제 가랑이 사이에 있는 파이톤도 빌려 드릴게요
(IP보기클릭)121.189.***.***
근첩-4999474945
파이톤? 바베이도스실뱀으로 보이는데! | 25.06.19 19:20 | | |
(IP보기클릭)220.125.***.***
근첩-4999474945
이런, 파이톤이 아니라 실뱀이었잖아! | 25.06.19 19:21 | | |
(IP보기클릭)118.235.***.***
잘 썼습니다 | 25.06.19 19:21 | | |
(IP보기클릭)14.50.***.***
이 정도면 파묘가 아니라 그냥 굴삭기를 꺼내온거 아니냐
(IP보기클릭)112.187.***.***
??? : 하란다고 진짜 하는놈들이 나오네
(IP보기클릭)118.235.***.***
자신있으시다길래 파헤쳐드림 ㅋㅋㅋ
(IP보기클릭)124.60.***.***
(IP보기클릭)222.117.***.***
(IP보기클릭)119.196.***.***
비교 프로그램 많이 있기야 한데 내가 딱 원하는 기능만 쓰고 버리기엔 요즘은 그냥 만드는게 낫더라고 | 25.06.19 19:22 | | |
(IP보기클릭)222.117.***.***
아 바인딩해서 아예 엑셀로 뽑아내는거네 | 25.06.19 19:23 | | |
(IP보기클릭)39.7.***.***
python 능숙하면 이게 세상편함.. 특히 대충 gpt 딸깍하면 틀도 다 만들어줌 | 25.06.19 20:25 | | |
(IP보기클릭)119.196.***.***
비슷한 툴은 많은데 내가 정확히 원하는 기능은 찾기가 힘들거나 없는 경우가 많아가지고 | 25.06.19 20:26 | | |
(IP보기클릭)221.163.***.***
(IP보기클릭)118.235.***.***
(IP보기클릭)211.234.***.***
(IP보기클릭)211.234.***.***
(IP보기클릭)119.196.***.***
아이작 파일 까본다는 유게이 있어서 해시값으로 먼저 필터링 해보라고 했었는데 진짜로 값 동일하게 나온다길래 그냥 스크립트 짜봤어 | 25.06.19 19:24 | | |
(IP보기클릭)115.88.***.***
누군가가 팬게임?의 음원 파일이 기존 게임에서 뜯어서 그대로 쓴거 아님? 하면서 확인했더니 그그실이었음 | 25.06.19 19:26 | | |
(IP보기클릭)59.12.***.***
(IP보기클릭)211.248.***.***
하긴 부지가 넓으면 중장비를 써야지~ | 25.06.19 19:25 | | |
(IP보기클릭)123.109.***.***
모르겠다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
(IP보기클릭)115.88.***.***
(IP보기클릭)119.196.***.***
코드 만들어달라고 할 때 병렬처리 과정 추가해달라고 요청한거라 효율은 잘 몰루겠어... | 25.06.19 19:30 | | |
(IP보기클릭)115.88.***.***
pip 느리면 uv 쓰는 방법도 있음. 나무위키 보다가 알았는데 한번 써봤더니 여러개 동시에 다운받고 빠름. | 25.06.19 19:30 | | |
(IP보기클릭)119.196.***.***
가상화는 갠찮긴 하드라고요 업무용 노트북에선 스크립트마다 가상화로 라이브러리 관리하는데 개인 pc에서는 이미 이것저것 해둔게 많아가지고 | 25.06.19 19:32 | | |
(IP보기클릭)49.164.***.***
(IP보기클릭)119.196.***.***
저어는 일하기 귀찮아서 업무자동화로 gpt쟝만 갈구는 엔지니어라 개발은 잘 몰라요... | 25.06.19 19:29 | | |
(IP보기클릭)49.164.***.***
뿌에엥... Python 쓰시려거든, GIL에 대해서도 한 번 찾아보시는 걸 추천드려요. 이게 최신 버전에서는 잘 동작할 수 있어도, 그 이하 버전에서는 GIL 때문에 멀티쓰레딩 쪽으로 기술적인 문제가 있었거든요. 힘내세용 | 25.06.19 19:30 | | |