Python으로 중복 이미지 찾고 삭제 후보 출력하기
이미지 폴더를 오래 운영하면 같은 사진이 다른 이름으로 저장되는 일이 자주 생깁니다. 이 글은 파일명을 믿지 않고 SHA-256 해시(파일 내용을 짧은 고유값으로 요약한 지문 - 내용이 같으면 값도 같습니다)로 같은 파일을 찾은 뒤, 삭제 전 검토할 후보만 출력하는 안전한 흐름을 설명합니다. 아래 코드를 파일로 저장하고 터미널(명령어를 입력하는 창)에서 python3 스크립트명.py 로 실행하면 됩니다.
정리 흐름
- 이미지 확장자만 대상으로 좁힙니다.
- 파일을 1MB 단위로 나눠 읽어 SHA-256 해시를 계산합니다(큰 파일도 메모리를 적게 씁니다).
- 처음 본 해시는 기준 파일로 기억합니다.
- 같은 해시가 다시 나오면 중복 후보로 출력합니다.
실전 예제 코드
from pathlib import Path
import hashlib
IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".gif"}
def sha256_file(path: Path) -> str:
# 파일을 1MB씩 나눠 읽어 SHA-256 해시(내용 지문)를 계산
digest = hashlib.sha256()
with path.open("rb") as f:
for chunk in iter(lambda: f.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def duplicate_candidates(root: str):
seen = {}
for path in Path(root).rglob("*"):
if not path.is_file() or path.suffix.lower() not in IMAGE_EXTS:
continue # 이미지 확장자만 검사
digest = sha256_file(path)
if digest in seen:
print(f"중복 후보: {path}")
print(f"원본 파일: {seen[digest]}")
print(f"해시 값 : {digest}\n")
else:
seen[digest] = path # 처음 본 해시는 원본으로 기억
duplicate_candidates("./images")
삭제 전에 확인할 것
해시가 같으면 바이트 단위로 같은 파일입니다. 그래도 자동 삭제 전에 백업, 썸네일 파일, 연결된 DB 기록이 함께 정리되는지 확인하는 편이 안전합니다.
파일명이 달라도 해시가 같으면 같은 파일인가요?
네. SHA-256 해시가 같다는 것은 현실적인 운영 범위에서 파일 바이트 내용이 같다고 판단해도 됩니다.
JPG와 WEBP가 같은 사진이면 해시도 같나요?
아니요. 같은 사진처럼 보여도 인코딩 형식이 다르면 파일 바이트가 다르므로 해시도 달라집니다.
자동 삭제까지 해도 되나요?
처음에는 삭제하지 말고 후보를 출력한 뒤 백업과 연동 파일을 확인하는 방식을 권장합니다.