무거운 빌드 아티팩트용 초고속 터미널 정리 도구
출처: Dev.to
나는 10년 넘게 개발자로 일해 왔고, 이 기간 동안 한 가지를 배웠어: 우리 하드 드라이브는 사실 빌드 아티팩트들의 매립지라는 거야.
몇 주 전만 하더라도 메인 SSD에 남은 공간이 2GB도 안 됐어. 중요한 파일 때문이 아니라 수십 개의 오래된 프로젝트에 흩어져 있는 노드 모듈 폴더, .next 빌드 캐시, dist 디렉터리 등 각종 쓰unk들이 쌓여 있었기 때문이야.
수동으로 공간을 회수해 보려 했어. 다들 알다시피 du -sh 로 문제 파일을 찾고, rm -rf 로 하나씩 삭제하면 돼. 동작은 하지만 tedious 해. npkill 은 node_modules 만 처리했고, wipe-modules 도 같은 제한이 있었어. 한 번에 모든 걸 찾고 한 번에 삭제할 수 있는 도구가 필요했어.
그래서 나는 ZapDir 을 만들었다.
ZapDir 은 프로젝트를 스캔해 무거운 빌드 아티팩트를 찾아내고, 아름다운 인터랙티브 UI 로 삭제할 수 있게 해 주는 터미널 정리 도구야. 완전히 무료이며 MIT 라이선스로 오픈소스이고 Node.js 18+ 로 동작한다.
npm install -g zapdir
zapdir
그걸 실행하면 다음과 같은 화면이 나타날 거야:
⚡ ZapDir — 터미널 정리 도구
🗑 Junk Found — 회수 가능한 쓰레기 총합: 1.47 GB
██████████ node_modules /node_modules 245.23 MB
████░░░░ .next /.next 1.23 GB
██░░░░░░ dist /dist 89.45 MB
✔ Delete 3개 항목 삭제해 1.47 GB를 회수할까요? · 예
✔ 디스크 공간 1.47 GB가 회수되었습니다!
색상 크기 막대기가 어떤 것이 가장 많은 공간을 차지하는지 한눈에 보여줘 — 500MB 초과는 빨강, 100MB 초과는 노랑, 나머지는 초록.
다른 정리 도구들은 있지만 대부분 하나의 패턴만 처리한다. ZapDir 은 다음과 같이 다른 도구들과 비교된다:
| Feature | ZapDir | npkill | wipe-modules |
|---|---|---|---|
| Patterns detected | 13+ | 1 (node_modules) | 1 (node_modules) |
| Interactive TUI | ✅ | ✅ | ❌ |
| Color-coded sizes | ✅ | ❌ | ❌ |
| Dry-run preview | ✅ | ❌ | ❌ |
| Async scanner | ✅ | ❌ | ❌ |
| Cross-platform | ✅ | ✅ | ✅ |
ZapDir 은 다음과 같은 패턴을 감지한다: node_modules, .next, .nuxt, .turbo, dist, build, .cache, coverage, out, target, .parcel-cache, pycache, 그리고 .DS_Store.
개발 머신에서 ZapDir 을 실행해 본 결과 다음과 같은 것이 나왔어:
-
~/Projects/legacy-app
node_modules + .next → 1.8 GB -
~/Projects/side-project
node_modules + build → 640 MB -
~/Projects/old-tutorial
node_modules → 420 MB -
~/.cache
various caches → 340 MB -
Various Rust projects (target directories) → 2.1 GB
-
Old Next.js projects (.next caches) → 3.4 GB
-
Abandoned monorepos (node_modules ×5) → 2.2 GB
-
Python projects (pycache + .cache) → 180 MB
-
Total reclaimed: roughly 12 GB
그 결과로 약 12 GB를 회수했으며, 필요한 파일을 하나도 건드리지 않고 정리할 수 있었어요. 가장 큰 승리는 오래된 Next.js 프로젝트들의 .next 캐시(몇 개는 1 GB 이상)였고, Rust 프로젝트들에서 target/ 디렉터리가 2 GB가 넘게 쌓였다는 점이었어요.
간단 답변: 네, --dry-run 플래그를 먼저 사용하면 돼.
zapdir --dry-run ~/Projects
이 명령은 실제 삭제하지 않고 정확히 어떤 항목이 삭제될지 보여줍니다. 출력은 각 항목의 크기, 경로, 그리고 시각적 막대를 포함해 무엇을 삭제할지 명확히 알려줘요.
예시 미리보기에 만족한다면 플래그를 빼고 실행해.
✔ 3개 항목 삭제해 1.47 GB를 회수할까요? · 예 / 아니오
스캐너는 fs.promises.readdir 를 사용해 비동기 병렬 탐색으로 빠르게 동작하며, 삭제는 Promise.allSettled 로 수행돼 하나의 파일에서 권한 오류가 발생해도 전체 연산이 중단되지 않아요. 해당 파일을 건너뛰고 계속 진행됩니다. 몇 주 째 사용해 왔으며 한 번도 필요한 파일을 잃어본 적이 없어요.
핵심 로직은 의외로 간단해. Node.js 내장 fs.promises 로 재귀적으로 디렉터리를 탐색하고, 파일 크기는 스트리밍 이터를 사용해 메모리 초과 없이 계산한다. @clack/prompts 로 만든 인터랙티브 선택 메뉴가 결과를 보여줘.
기본적으로 .git 와 같은 숨김 디렉터리는 속도 향상을 위해 건너뛰어.
고객의 홈 디렉터리(수천 개 폴더) 전체 스캔은 10초 미만으로 끝남.
현재 나는 이렇게 해:
zapdir --dry-run ~/Projects
이렇게 하면 얼마나 쓰레기가 쌓였는지 빠르게 확인할 수 있어. 결과가 1 GB를 넘으면 실제 실행해 공간을 회수해.
이는 brew update 와 npm outdated 와 함께 정기적인 유지 보수 루틴이 되었어요.
디스크 공간이 부족하고 오래된 프로젝트가 있다면 사용해 보세요:
npm install -g zapdir
zapdir
설치에 5초가 걸리고 기가байт 수준의 공간을 회수할 수 있어요. 코드는 MIT 라이선스로 오픈소스이므로 실행하기 전에 정확히 무엇을 하는지 확인할 수 있습니다.
⭐ GitHub 레포를 별 ⭐ (star) 해 주세요. 다른 개발자들에게도 도움이 됩니다.
ZapDir 은 MIT 라이선스로 오픈소스이며, 기여와 기능 요청, 버그 리포트는 GitHub에서 환영합니다.