중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

매달 PC 정리하는 시간 끝! 파이썬으로 정기 점검 한 번에 자동화하기

매달 PC 정리하는 시간 끝! 파이썬으로 정기 점검 한 번에 자동화하기 (완성 코드 공개)

파이썬으로 PC 정기 점검과 정리 작업을 한 번에 자동화하는 모습


이 블로그에서는 지금까지 중복 파일 삭제, 폴더 용량 분석, ZIP 압축, 폴더 백업을 각각 따로 소개했습니다. 이번 글에서는 이 네 가지 작업을 하나의 스크립트로 통합해서, 실행 한 번으로 PC를 점검하고 정리하는 종합 도구를 만들어 보겠습니다. 매달 첫째 주에 한 번씩 실행하면 PC를 깨끗하게 유지할 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

이번 통합 스크립트에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install pandas openpyxl

중복 탐지, 용량 분석, 압축은 파이썬 기본 내장 라이브러리(hashlib, zipfile, pathlib)로 처리하고, 결과 보고서만 pandasopenpyxl로 엑셀에 정리합니다.

💡 이 코드로 할 수 있는 것: 지정한 폴더의 용량을 분석하고, 중복 파일을 탐지해 목록으로 정리하고, 오래된 파일을 자동 백업한 뒤, 전체 점검 결과를 하나의 엑셀 보고서로 만듭니다. 실제 파일 삭제는 사람이 직접 확인 후 진행하도록 안전하게 설계했습니다.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, pc_checkup.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import hashlib
import zipfile
import shutil
import time
from pathlib import Path
from datetime import datetime
from collections import defaultdict
import pandas as pd

# ① 설정
TARGET_FOLDER = r"C:\Users\내이름\Desktop\정리대상"        # ← 점검할 폴더
BACKUP_DIR    = r"D:\월간백업"                              # ← 백업 저장 위치
REPORT_PATH   = r"C:\Users\내이름\Desktop\PC점검_보고서.xlsx"
KEEP_BACKUP_DAYS = 90   # ← 백업 보관 기간

report_data = {}

# ② 1단계: 폴더 용량 분석
print("="*50)
print("📊 1단계: 폴더 용량 분석")
print("="*50)

def get_folder_size(path):
    total = 0
    for item in path.rglob("*"):
        if item.is_file():
            try:
                total += item.stat().st_size
            except (PermissionError, OSError):
                pass
    return total

target = Path(TARGET_FOLDER)
size_results = []
for folder in [f for f in target.iterdir() if f.is_dir()]:
    size_mb = round(get_folder_size(folder) / 1024 / 1024, 1)
    size_results.append({"폴더명": folder.name, "용량(MB)": size_mb})
    print(f"  ✔ {folder.name}: {size_mb}MB")

report_data["용량분석"] = pd.DataFrame(size_results).sort_values("용량(MB)", ascending=False)

# ③ 2단계: 중복 파일 탐지
print("\n" + "="*50)
print("🔍 2단계: 중복 파일 탐지")
print("="*50)

def get_hash(filepath):
    h = hashlib.md5()
    with open(filepath, "rb") as f:
        while chunk := f.read(8192):
            h.update(chunk)
    return h.hexdigest()

hash_map = defaultdict(list)
for file in target.rglob("*"):
    if file.is_file():
        try:
            hash_map[get_hash(file)].append(file)
        except Exception:
            pass

duplicate_rows = []
for file_hash, files in hash_map.items():
    if len(files) > 1:
        for f in files:
            duplicate_rows.append({"파일명": f.name, "경로": str(f.parent),
                                   "크기(KB)": round(f.stat().st_size/1024, 1)})

print(f"  ✔ 중복 그룹 발견: {sum(1 for f in hash_map.values() if len(f)>1)}개")
report_data["중복파일"] = pd.DataFrame(duplicate_rows) if duplicate_rows else pd.DataFrame()

# ④ 3단계: 90일 이상 지난 백업 자동 정리
print("\n" + "="*50)
print("🗑 3단계: 오래된 백업 정리")
print("="*50)

backup_dir = Path(BACKUP_DIR)
backup_dir.mkdir(parents=True, exist_ok=True)
deleted_count = 0

for old_file in backup_dir.glob("*.zip"):
    age_days = (time.time() - old_file.stat().st_mtime) / 86400
    if age_days > KEEP_BACKUP_DAYS:
        old_file.unlink()
        print(f"  🗑 삭제: {old_file.name} ({int(age_days)}일 경과)")
        deleted_count += 1

print(f"  ✔ 정리 완료: {deleted_count}개 삭제")

# ⑤ 4단계: 전체 폴더 압축 백업
print("\n" + "="*50)
print("💾 4단계: 압축 백업 생성")
print("="*50)

date_str = datetime.now().strftime("%Y%m%d")
zip_path = backup_dir / f"{target.name}_{date_str}.zip"
file_count = 0

with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
    for file in target.rglob("*"):
        if file.is_file():
            zf.write(file, file.relative_to(target.parent))
            file_count += 1

zip_size_mb = round(zip_path.stat().st_size / 1024 / 1024, 1)
print(f"  ✔ 백업 완료: {file_count}개 파일, {zip_size_mb}MB → {zip_path.name}")

# ⑥ 종합 보고서 저장
print("\n" + "="*50)
print("📝 종합 보고서 작성 중...")
print("="*50)

summary = pd.DataFrame([{
    "점검일시": datetime.now().strftime("%Y-%m-%d %H:%M"),
    "분석폴더": str(target),
    "전체용량(MB)": report_data["용량분석"]["용량(MB)"].sum(),
    "중복파일그룹": sum(1 for f in hash_map.values() if len(f) > 1),
    "백업파일": zip_path.name,
    "백업크기(MB)": zip_size_mb,
    "정리된오래된백업": deleted_count,
}])

with pd.ExcelWriter(REPORT_PATH, engine="openpyxl") as writer:
    summary.to_excel(writer, sheet_name="종합요약", index=False)
    report_data["용량분석"].to_excel(writer, sheet_name="폴더별용량", index=False)
    if not report_data["중복파일"].empty:
        report_data["중복파일"].to_excel(writer, sheet_name="중복파일목록", index=False)

print(f"  ✔ 보고서 저장 완료 → {REPORT_PATH}")
print(f"\n✅ 전체 점검 완료!")

3단계: 실행 방법

  1. 코드 ① 설정의 TARGET_FOLDER에 점검할 폴더 경로를 입력합니다.
  2. BACKUP_DIR에 백업을 저장할 위치(외장 하드 권장)를 입력합니다.
  3. 터미널에서 아래 명령어로 실행합니다:
python pc_checkup.py

정상 실행 시 터미널에 4단계 작업이 순서대로 출력됩니다:

==================================================
📊 1단계: 폴더 용량 분석
==================================================
  ✔ 다운로드: 8420.3MB
  ✔ 문서: 1240.5MB

==================================================
🔍 2단계: 중복 파일 탐지
==================================================
  ✔ 중복 그룹 발견: 3개

==================================================
🗑 3단계: 오래된 백업 정리
==================================================
  🗑 삭제: 정리대상_20260201.zip (95일 경과)
  ✔ 정리 완료: 1개 삭제

==================================================
💾 4단계: 압축 백업 생성
==================================================
  ✔ 백업 완료: 1248개 파일, 2150.8MB → 정리대상_20260629.zip

==================================================
📝 종합 보고서 작성 중...
==================================================
  ✔ 보고서 저장 완료 → C:\Users\내이름\Desktop\PC점검_보고서.xlsx

✅ 전체 점검 완료!

완성된 엑셀 보고서에는 종합요약, 폴더별용량, 중복파일목록 3개 시트가 들어 있어 한눈에 PC 상태를 파악할 수 있습니다.


4단계: 자주 발생하는 오류와 해결법

오류 1: 전체 실행 시간이 너무 오래 걸림

용량 분석과 중복 탐지를 같은 폴더에서 두 번 스캔하기 때문에 파일이 많으면 시간이 걸립니다. 자주 점검하지 않는 폴더라면 새벽 시간에 스케줄러 편으로 예약 실행하는 것을 권장합니다.

오류 2: 백업 드라이브 연결이 끊겨 4단계에서 오류 발생

BACKUP_DIR이 외장 하드 경로인데 연결이 끊긴 경우입니다. 코드 시작 부분에 아래 확인 코드를 추가하세요:

if not Path(BACKUP_DIR).exists():
    print("⚠ 백업 드라이브가 연결되어 있지 않습니다. 연결 후 다시 실행하세요.")
    exit()

오류 3: 중복 파일이 보고서에는 있는데 삭제는 안 됨

의도된 동작입니다. 이 통합 스크립트는 안전을 위해 중복 파일을 자동 삭제하지 않고 목록만 보고서에 남깁니다. 실제 삭제가 필요하면 중복 파일 자동 삭제 편의 코드로 보고서를 확인한 뒤 별도로 진행하세요.


응용: 매달 자동으로 실행되게 예약하기

윈도우 작업 스케줄러로 매달 1일 새벽에 자동 실행되게 설정하면 사람이 신경 쓰지 않아도 PC가 자동으로 점검·정리됩니다. 작업 스케줄러 설정 방법은 스케줄러 완전 정복 편을 참고하세요.

💡 알림까지 받고 싶다면: 텔레그램 자동 발송 편의 코드를 마지막 줄에 추가하면 점검이 끝날 때마다 결과 요약을 텔레그램으로 받을 수 있습니다.

핵심 요약

  • 준비물: Python + pandas + openpyxl 설치 (pip install pandas openpyxl)
  • 설정: TARGET_FOLDER, BACKUP_DIR, KEEP_BACKUP_DAYS 수정
  • 실행: 터미널에서 python pc_checkup.py 입력
  • 처리 순서: 용량 분석 → 중복 탐지 → 오래된 백업 정리 → 새 백업 생성 → 종합 보고서
  • 안전장치: 중복 파일은 목록만 보고, 실제 삭제는 사람이 별도로 확인 후 진행

이 코드를 응용하면 여러 폴더를 동시에 점검하거나, 점검 결과를 매달 비교해서 용량 증가 추세를 추적하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁