rdfind는 중복 파일을 검색하기 위한 터미널에서 셸 커맨드로 사용할 수 있는 C++로 작성된 CLI 유틸리티다. 입력된 디렉터리 아래의 모든 파일을 대조하는데 파일 이름이 아닌 파일의 내용으로 중복 여부를 판단한다는 점이 특징이다. 이 유틸리티의 설치법 및 사용법을 간단히 알아보자.
설치 방법 (via HomeBrew)
설치 방법은 공식 GitHub 프로젝트 저장소의 문서에 따르면 각 OS에 따른 여러 방법이 있는데 macOS에서는 설명에는 없는 Homebrew로도 설치할 수 있다.
brew install rdfind
개인적으로 Homebrew를 선호하는데, 사용하는 패키지 매니저에 따라 적절히 설치하면 된다. 애초에 오픈소스이기 때문에 원한다면 직접 빌드하는 것도 가능하다.
기본 사용법
기본 사용법은 단순하게 비교할 디렉터리를 입력하기만 하면 된다. 예를 들어 현재 디렉터리(./)에서 중복된 파일을 검색하려면 아래와 같이 입력하기만 하면 된다.
rdfind .
rdfind는 하위 디렉터리까지 몽땅 뒤져보기 때문에 실행시킨 위치에 따라 검색에 상당히 오래 걸릴 수도 있으니 주의하자. 어쨌든 별다른 옵션이 없다면 결과를 대충 정리해서 보여주고 상세 결과는 result.txt라는 파일에 별도로 정리해 준다. 수동으로 중복된 파일을 지우고 싶다면 이 result.txt 파일을 읽어보자.
이외에 필요하다면 검색할 디렉터리를 더 추가할 수도 있다.
rdfind dir-A dir-B dir-C ...
기본적으로는 중복된 파일을 발견했다고 해도 이외의 특수한 행동은 하지 않는다.
중복 판단 알고리즘
기본적인 상태에서 사용해 보면 결과들 중 다음과 같은 형태의 메시지를 볼 수 있다.
Now eliminating candidates based on first bytes: removed 152 files from list. 1266 files left.
Now eliminating candidates based on last bytes: removed 120 files from list. 1146 files left.
Now eliminating candidates based on sha1 checksum: removed 959 files from list. 187 files left.
이 메시지로 유추하다면 두 파일의 중복 여부를 비교하는 방법을 쉽게 알 수 있다. 우선 파일의 첫 수 바이트가 동일한지 비교해 보고 동일하다면 마지막 수 바이트를 비교한다. 마지막 수 바이트까지 동일하면 sha1 알고리즘(옵션으로 다른 알고리즘 선택 가능)으로 생성한 파일의 체크섬을 비교하는 것 같다. 이 정도면 100%는 아니겠지만 현실적(?)으로 완벽하게 두 파일의 중복 여부를 빠르게 비교할 수 있다고 생각된다.
파일 전체 목록에서 비교하는 알고리즘은 훨씬 복잡한데 공식 프로젝트 저장소에서 설명하고 있으므로 생략한다.
이 외에 옵션으로 여러 비교 방법을 정의하고 있다. 예를 들어 사이즈가 0인 파일은 비교에서 제외하는 등 말이다.
기타
CLI 유틸리티이기 때문에 굉장히 많은 옵션이 제공되니 상세한 사용법은 man 페이지나 --help 커맨드로 도움말을 읽어보는 것이 좋다.
개인적으로는 꼽는 특수한 옵션으로 -deleteduplicates true 옵션이 있는데 말 그대로 중복된 파일을 삭제하는 옵션이다. 물론 위험한 커맨드이니 사용에 주의하자. 자동 삭제는 정말 지워져도 무방한 파일만 있을 경우 사용하고 이외에는 결과를 보고 수동으로 삭제하는 편을 추천한다.
'기술적인 이야기 > 터미널 및 셸' 카테고리의 다른 글
셸에서 텍스트 치환하기 (feat. sed) (0) | 2023.12.06 |
---|---|
macOS 터미널에서 QR코드 생성하기 (3) | 2023.11.11 |
imagemagick으로 사진 연결하기 (2) | 2023.05.20 |
어느날 git pull이 무서운 보안 오류를 내뿜었다 (1) | 2023.03.24 |
gitui - Rust로 만든 가벼운 터미널용 Git 클라이언트 (387) | 2022.05.01 |
댓글