프로젝트 소개

findDupes는 Go로 작성된 명령줄 유틸리티로, 파일 이름이 아닌 콘텐츠 해시를 통해 중복 파일을 찾으므로 이름이 다른 복사본도 감지할 수 있습니다. 하나 이상의 디렉토리를 검색하며 동시 해싱을 수행합니다. 스캔은 모든 파일을 전체적으로 읽는 것을 피하기 위해 단계별로 진행됩니다. 먼저 제공된 루트 디렉토리를 재귀적으로 탐색하여 각 일반 파일의 경로와 크기를 수집합니다. 발견된 파일 중 크기가 고유한 파일은 동일한 복사본을 가질 수 없으므로 제외됩니다. 남은 후보들은 워커 풀(worker pool)에 의해 처음 4 KiB가 해싱되며, 해당 접두사 해시를 공유하는 파일만 다시 읽어 SHA-256으로 전체 해싱을 수행합니다. 전체 해시가 동일한 파일들이 중복으로 보고됩니다. 크기 및 접두사 확인은 순수하게 필터 역할을 하므로, 크기나 접두사 해시가 다른 파일들은 서로 전체 해싱을 수행하지 않습니다. 루트 처리 과정은 매우 신중하게 설계되었습니다. 루트는 스캔 전 절대 경로로 변환되고 심볼릭 링크가 해결됩니다. 중복되거나 겹치는 루트(예: 동일한 디렉토리가 두 번 지정되었거나, 디렉토리와 그 하위 디렉토리가 함께 지정된 경우)는 서로 다른 표기법이나 동일한 심볼릭 링크를 통해 해결되는 경로를 포함하여 중복 제거됩니다. 스캔 중인 디렉토리 내부에서 발견된 심볼릭 링크는 따라가지 않으며, 일반 파일만 수집하고 동일한 하드 링크 파일에 대한 여러 경로는 한 번만 수집합니다. 해싱 중 읽을 수 없는 파일은 로그에 기록되고 건너뜁니다. 루트를 해결하거나 탐색할 수 없는 경우에도 다른 루트에서 찾은 파일들은 계속 처리되지만, 결과 출력 후 명령은 에러를 반환합니다. Ctrl-C 및 SIGTERM은 활성 스캔을 취소하며, 작업은 파일 시스템 읽기 사이에서 중단됩니다. 중복 그룹은 SHA-256 해시, 파일 크기 및 경로와 함께 출력됩니다. 반복 가능한 출력을 위해 각 그룹 내의 경로와 그룹 자체는 정렬됩니다. 플래그로는 스캔 중 진행 상황을 표시하는 -v/--verbose, 동시 해싱 워커 수를 지정하는 -w/--workers(기본값: CPU 수), 해시, 크기, 경로 필드를 가진 줄 바꿈 구분 JSON 객체를 출력하는 --json, stderr에 스캔 통계를 출력하는 --stats, 그리고 --version이 있습니다. 통계에는 발견된 파일, 크기 필터링된 파일, 콘텐츠 해시 후보, 중복 그룹 및 중복 파일 수가 포함됩니다. 통계를 stderr에 기록함으로써 JSON 출력을 jq와 같은 도구로 파이프 연결하여 안전하게 사용할 수 있습니다. 설치에는 Go 1.25 이상 버전이 필요하며, go install github.com/mojotx/findDupes@latest 명령어를 사용하거나 저장소를 클론한 후 go install -v ./...를 실행하여 설치할 수 있습니다. 저장소에는 CI 및 CodeQL 워크플로우가 포함되어 있으며, 테스트 매트릭스는 go.mod에 선언된 Go 버전을 사용하여 Linux, macOS, Windows에서 race-enabled 스위트(suite)를 실행합니다.