다운로드 폴더는 대부분의 Mac 사용자에게 데이터 처리의 병목입니다. 브라우저에서 내려받은 파일, 이메일 첨부 저장, 스크린샷 임시 복사, 개발자라면 .dmg와 .zip이 계속 쌓입니다. 이 노트는 Hazel과 launchd를 조합해 다운로드 폴더를 자동 정리하는 실전 셋업을 정리합니다.
문제 정의
편집팀의 원래 상태는 다음과 같았습니다. 다운로드 폴더에 몇 백 개의 파일이 쌓여 있고, 그중 90퍼센트는 이미 필요 없는 것들. 나머지 10퍼센트가 어디에 있는지 찾기 위해 검색을 반복. 주기적으로 수동 정리를 시도했지만 며칠 지나면 같은 상태로 돌아옵니다.
목표는 세 가지였습니다. 첫째, 다운로드 폴더가 항상 비어있거나 최근 몇 시간의 파일만 남아있는 상태 유지. 둘째, 파일 타입에 따라 적절한 위치로 자동 이동. 셋째, 오래된 임시 파일은 자동 삭제.
도구 선택
Hazel은 폴더 감시와 규칙 기반 자동화의 표준적인 선택입니다. Noodlesoft의 성숙한 상용 유틸리티로, 십수 년 넘게 유지되고 있습니다. macOS 업데이트에 따라 꾸준히 대응됩니다.
대안으로 Automator와 Folder Actions를 고려했지만 규칙 관리가 어려워 배제했습니다. Shortcuts 앱의 폴더 자동화도 검토했지만, 트리거 조건과 액션의 유연성에서 Hazel이 앞섭니다.
launchd는 macOS의 표준 작업 스케줄러입니다. Hazel이 파일 이벤트 기반이라면, launchd는 시간 기반 작업에 어울립니다. 우리는 두 도구를 역할에 따라 나눠 사용합니다.
Hazel 규칙 구성
다운로드 폴더에 대한 Hazel 규칙은 다음 순서로 평가되도록 배치했습니다. Hazel은 규칙을 위에서 아래로 순차적으로 평가하고, 매칭되면 다음 규칙은 스킵하는 옵션이 있습니다.
규칙 1: 스크린샷 정리. 파일명이 Screenshot 또는 스크린샷으로 시작하는 파일을 ~/Pictures/Screenshots 폴더로 이동. 하위 폴더는 년-월 형식 (예: 2024-01)으로 자동 생성.
규칙 2: 이미지 파일 분류. .jpg, .png, .heic, .webp 확장자 중 위 규칙에 해당하지 않는 것은 ~/Pictures/Downloads로 이동.
규칙 3: 문서 파일 분류. .pdf, .docx, .pages, .txt, .md는 ~/Documents/Downloads로 이동. 이 폴더 안에서 다시 년-월 서브폴더로 분류.
규칙 4: 설치 파일 처리. .dmg, .pkg는 3일 후 자동 삭제. 설치 파일은 대개 설치 후 즉시 필요 없어집니다. 3일이면 설치 전에 이미 옮겨간 파일이 아닌지 확인할 여유가 됩니다.
규칙 5: 압축 파일 처리. .zip, .tar.gz는 7일 후 삭제. 압축 파일은 대개 압축 해제 후 원본이 필요 없어집니다.
규칙 6: 캐치올. 위 어떤 규칙에도 매칭되지 않는 파일은 30일 후 삭제. 이 규칙은 다운로드 폴더가 완전히 잊혀진 파일로 넘치지 않게 하는 안전망입니다.
launchd로 주기적 작업 추가
Hazel은 파일 시스템 이벤트 기반이라 주기적 작업에는 launchd가 더 어울립니다. 우리는 launchd로 두 가지 주기 작업을 걸어뒀습니다.
매일 오전 9시, 스크린샷 폴더의 오래된 파일 정리. 90일 이상 지난 스크린샷은 별도의 아카이브 폴더로 이동. 삭제하지는 않습니다. 스크린샷은 나중에 예상치 못하게 필요해질 수 있어서 완전 삭제보다 아카이빙이 안전합니다.
매주 일요일 오전 10시, 다운로드 폴더 요약 리포트 생성. 지난 주에 얼마나 많은 파일이 이동/삭제됐는지, 어떤 카테고리가 가장 많았는지 간단한 텍스트 리포트를 ~/Documents/Downloads/reports에 저장. 실질적 목적보다는 자동화가 잘 돌아가고 있는지 주기적으로 확인하는 용도입니다.
launchd plist 예시
launchd 작업은 ~/Library/LaunchAgents/에 .plist 파일로 정의합니다. 스크린샷 아카이빙 작업의 plist는 다음과 같이 구성했습니다.
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.tropic.screenshot-archive</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>/Users/username/scripts/archive-screenshots.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
등록은 launchctl load ~/Library/LaunchAgents/com.tropic.screenshot-archive.plist. 확인은 launchctl list | grep tropic.
실행 스크립트
스크린샷 아카이빙 스크립트는 zsh로 단순하게 작성했습니다. 90일 이상 지난 파일을 find로 찾아 아카이브 폴더로 이동하는 방식.
#!/bin/zsh
SOURCE="$HOME/Pictures/Screenshots"
ARCHIVE="$HOME/Pictures/Screenshots-Archive"
mkdir -p "$ARCHIVE"
find "$SOURCE" -type f -mtime +90 -exec mv {} "$ARCHIVE" \;
# 빈 년-월 폴더 정리
find "$SOURCE" -type d -empty -delete
실행 권한을 잊지 마세요: chmod +x ~/scripts/archive-screenshots.sh.
실제 사용 후 관찰
이 셋업을 도입한 뒤 다운로드 폴더의 파일 수는 대개 5개 이하로 유지됩니다. 지금 다운로드 진행 중인 파일이나 오늘 받은 파일 몇 개만 있습니다. 나머지는 자동으로 적절한 위치로 이동됩니다.
예상보다 유용했던 것은 년-월 서브폴더 분류였습니다. “그 PDF 언제 다운로드했더라”라고 검색할 때 대략적인 시점만 알아도 폴더로 좁혀서 찾을 수 있습니다. Finder 검색보다 폴더 브라우징이 빠른 경우가 종종 있습니다.
예상보다 걸림돌이 된 것은 규칙 순서 관리였습니다. 새 규칙을 추가하다 보면 앞선 규칙이 매칭되어 새 규칙이 실행되지 않는 경우가 있습니다. Hazel의 “규칙이 매칭되면 스킵” 옵션을 제대로 이해하고 관리해야 합니다.
주의할 점
자동 삭제 규칙은 처음 몇 주 동안 조심스럽게 지켜보기를 권합니다. 예상치 못한 중요 파일이 삭제 대상에 포함될 수 있습니다. Hazel의 로그에서 어떤 파일이 어떤 규칙에 매칭됐는지 확인할 수 있으니, 초기에는 자주 확인하고 규칙을 조정하세요.
iCloud Drive 동기화 폴더에는 Hazel 규칙을 걸지 마세요. 동기화 이벤트가 파일 이벤트로 오인되어 규칙이 무한 반복될 수 있습니다.
launchd 스크립트는 안전한 위치의 파일을 대상으로 시작하기를 권합니다. 처음부터 삭제 스크립트를 돌리지 말고, 며칠 동안 로그만 남기는 dry-run 스크립트로 안전성을 확인한 뒤 실제 동작을 붙이세요.
확장 가능한 방향
이 기본 셋업 위에 여러 확장이 가능합니다. 개발자라면 Xcode 아카이브 파일, 시뮬레이터 캐시, 노드 모듈 폴더에 대한 정기적 정리도 launchd로 걸 수 있습니다. 사진 편집자라면 RAW 파일 자동 분류, 편집 후 별도 폴더 이동 등의 규칙을 추가할 수 있습니다.
중요한 것은 처음부터 모든 규칙을 완벽하게 짜지 않는 것입니다. 기본 셋업으로 몇 주 사용해본 뒤 실제 파일 흐름을 관찰하고, 반복되는 마찰 지점에 규칙을 추가해가는 방식이 지속 가능합니다.