---
name: duplicate-file-cleaner
description: 중복 이미지 및 미디어 파일을 메타데이터 기반으로 찾아 안전하게 제거합니다. 중복 파일 정리, 파일 정리, 용량 확보 요청 시 활성화됩니다.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
---

# Duplicate File Cleaner Expert

중복 파일을 탐지하고 안전하게 제거하는 스킬입니다.

## 기능

### 탐지 방법
- **해시 비교**: MD5/SHA256 체크섬으로 정확한 중복 탐지
- **파일명 유사도**: 이름 기반 잠재적 중복 탐지
- **메타데이터 분석**: EXIF, 생성일시, 크기 비교
- **퍼지 매칭**: 리사이즈/재인코딩된 유사 파일 탐지

### 지원 파일 유형
- 이미지: jpg, png, gif, webp, bmp, tiff
- 비디오: mp4, avi, mkv, mov, wmv
- 오디오: mp3, wav, flac, aac
- 문서: pdf, doc, xls (선택적)

### 안전 기능
- 삭제 전 미리보기
- 휴지통으로 이동 (영구 삭제 방지)
- 원본 보존 우선 (수정일 기준)
- 롤백 가능한 로그 생성

## 사용 스크립트

### Python 중복 탐지
```python
import hashlib
import os
from pathlib import Path
from collections import defaultdict

def get_file_hash(filepath, chunk_size=8192):
    """파일의 MD5 해시 계산"""
    hasher = hashlib.md5()
    with open(filepath, 'rb') as f:
        while chunk := f.read(chunk_size):
            hasher.update(chunk)
    return hasher.hexdigest()

def find_duplicates(directory, extensions=None):
    """디렉토리에서 중복 파일 찾기"""
    hash_map = defaultdict(list)

    for filepath in Path(directory).rglob('*'):
        if not filepath.is_file():
            continue
        if extensions and filepath.suffix.lower() not in extensions:
            continue

        file_hash = get_file_hash(filepath)
        hash_map[file_hash].append(filepath)

    # 중복된 것만 반환
    return {h: files for h, files in hash_map.items() if len(files) > 1}

def generate_report(duplicates):
    """중복 파일 리포트 생성"""
    total_size = 0
    report = ["# 중복 파일 리포트\n"]

    for hash_val, files in duplicates.items():
        size = os.path.getsize(files[0])
        savings = size * (len(files) - 1)
        total_size += savings

        report.append(f"\n## 해시: {hash_val[:8]}...")
        report.append(f"크기: {size:,} bytes | 절약 가능: {savings:,} bytes")
        for f in files:
            mtime = os.path.getmtime(f)
            report.append(f"  - {f} (수정: {mtime})")

    report.append(f"\n---\n총 절약 가능 용량: {total_size:,} bytes ({total_size/1024/1024:.2f} MB)")
    return '\n'.join(report)

# 사용 예시
extensions = {'.jpg', '.jpeg', '.png', '.gif', '.mp4'}
duplicates = find_duplicates('/path/to/directory', extensions)
print(generate_report(duplicates))
```

### Bash 빠른 탐지
```bash
#!/bin/bash
# 중복 파일 빠른 탐지 (크기 + 해시 기반)

find "$1" -type f -name "*.jpg" -o -name "*.png" | while read file; do
    size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file")
    hash=$(md5sum "$file" | cut -d' ' -f1)
    echo "$size $hash $file"
done | sort | uniq -D -w 40
```

## 리포트 구조

```markdown
# 중복 파일 분석 리포트

## 요약
- 스캔 파일: 1,234개
- 중복 그룹: 45개
- 중복 파일: 123개
- 절약 가능 용량: 2.3 GB

## 중복 그룹 상세

### 그룹 1 (3개 파일, 15.2 MB 절약 가능)
| 파일 | 경로 | 수정일 | 권장 |
|------|------|--------|------|
| photo.jpg | /photos/2023/ | 2023-05-01 | ✅ 유지 |
| photo(1).jpg | /downloads/ | 2023-06-15 | ❌ 삭제 |
| IMG_001.jpg | /backup/ | 2023-05-01 | ❌ 삭제 |

### 그룹 2 ...

## 권장 조치
1. 자동 선택된 78개 파일 삭제 (1.8 GB)
2. 수동 검토 필요: 12개 그룹
3. 백업 폴더 정리 권장

## 실행 명령
```bash
# 안전 삭제 (휴지통으로 이동)
trash-put file1.jpg file2.jpg ...

# 또는 영구 삭제 (주의!)
rm file1.jpg file2.jpg ...
```
```

## 사용 예시

```
이 폴더의 중복 파일을 찾아줘
사진 폴더에서 중복 이미지를 정리해줘
용량을 확보하기 위해 중복 파일을 분석해줘
```

## 주의사항

- 삭제 전 항상 백업 권장
- 시스템 파일은 스캔에서 제외
- 심볼릭 링크 주의 필요
- 클라우드 동기화 폴더 주의

## 출처
Original skill from skills.cokac.com
