중복 파일을 찾아 정리하는 것은 대부분의 컴퓨터 사용자에게 흔히 필요한 작업입니다. 하지만 수많은 파일 속에서 중복된 파일을 일일이 찾아내고 삭제하는 일은 시간도 많이 들고 지루한 작업이죠. 다행히 GNU/Linux 기반 시스템이라면 fdupes 유틸리티 하나로 이 문제를 아주 쉽게 해결할 수 있습니다.
fdupes란 무엇인가?
fdupes는 Adrian Lopez가 C 언어로 개발하여 MIT 라이선스로 배포하는 리눅스 유틸리티입니다. 지정한 디렉터리와 하위 디렉터리에서 중복 파일을 찾아내며, 파일의 MD5 서명을 비교한 후 바이트 단위 비교까지 수행해 정확하게 중복 여부를 판별합니다. 다양한 옵션을 조합하면 중복 파일 목록 조회, 삭제, 그리고 하드링크로 대체하는 작업까지 가능합니다.
fdupes의 파일 비교는 다음 순서로 진행됩니다.
파일 크기 비교 > 부분 MD5 서명 비교 > 전체 MD5 서명 비교 > 바이트 단위 비교
리눅스에 fdupes 설치하기
Debian 계열 (Ubuntu, Linux Mint 등)
최신 버전의 fdupes(1.51)는 Debian 계열 배포판에서 아래 명령어 한 줄로 간단히 설치할 수 있습니다.
$ sudo apt-get install fdupes
CentOS / RHEL / Fedora 계열
CentOS나 RHEL, Fedora 기반 시스템에서는 EPEL 저장소를 활성화한 후 설치해야 합니다.
# yum install fdupes # dnf install fdupes [Fedora 22 이상]
참고: Fedora 22부터 기본 패키지 관리자가 yum에서 dnf로 변경되었습니다.
fdupes 사용 방법
1. 테스트용 중복 파일 만들기
설명을 위해 먼저 디렉터리(예: tecmint) 안에 중복 파일 몇 개를 생성해 보겠습니다.
$ mkdir /home/"$USER"/Desktop/tecmint && cd /home/"$USER"/Desktop/tecmint && for i in {1..15}; do echo "I Love Tecmint. Tecmint is a very nice community of Linux Users." > tecmint${i}.txt ; done명령 실행 후 ls 명령으로 파일이 제대로 생성되었는지 확인합니다.
$ ls -l total 60 -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint10.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint11.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint12.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint13.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint14.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint15.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint1.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint2.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint3.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint4.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint5.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint6.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint7.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint8.txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt
위 스크립트는 tecmint1.txt부터 tecmint15.txt까지 총 15개의 파일을 생성하며, 모든 파일에는 동일한 내용이 들어 있습니다.
2. 특정 폴더에서 중복 파일 검색하기
$ fdupes /home/$USER/Desktop/tecmint /home/tecmint/Desktop/tecmint/tecmint13.txt /home/tecmint/Desktop/tecmint/tecmint8.txt /home/tecmint/Desktop/tecmint/tecmint11.txt /home/tecmint/Desktop/tecmint/tecmint3.txt /home/tecmint/Desktop/tecmint/tecmint4.txt /home/tecmint/Desktop/tecmint/tecmint6.txt /home/tecmint/Desktop/tecmint/tecmint7.txt /home/tecmint/Desktop/tecmint/tecmint9.txt /home/tecmint/Desktop/tecmint/tecmint10.txt /home/tecmint/Desktop/tecmint/tecmint2.txt /home/tecmint/Desktop/tecmint/tecmint5.txt /home/tecmint/Desktop/tecmint/tecmint14.txt /home/tecmint/Desktop/tecmint/tecmint1.txt /home/tecmint/Desktop/tecmint/tecmint15.txt /home/tecmint/Desktop/tecmint/tecmint12.txt
3. 하위 디렉터리까지 재귀적으로 검색하기 (-r 옵션)
-r 옵션을 사용하면 모든 하위 디렉터리까지 재귀적으로 탐색합니다. 파일과 폴더의 수에 따라 스캔에 시간이 걸릴 수 있으며, 그동안 터미널에는 진행 상황이 표시됩니다.
$ fdupes -r /home Progress [37780/54747] 69%
4. 중복 파일의 크기 확인하기 (-S 옵션)
$ fdupes -S /home/$USER/Desktop/tecmint 65 bytes each: /home/tecmint/Desktop/tecmint/tecmint13.txt /home/tecmint/Desktop/tecmint/tecmint8.txt /home/tecmint/Desktop/tecmint/tecmint11.txt /home/tecmint/Desktop/tecmint/tecmint3.txt /home/tecmint/Desktop/tecmint/tecmint4.txt /home/tecmint/Desktop/tecmint/tecmint6.txt /home/tecmint/Desktop/tecmint/tecmint7.txt /home/tecmint/Desktop/tecmint/tecmint9.txt /home/tecmint/Desktop/tecmint/tecmint10.txt /home/tecmint/Desktop/tecmint/tecmint2.txt /home/tecmint/Desktop/tecmint/tecmint5.txt /home/tecmint/Desktop/tecmint/tecmint14.txt /home/tecmint/Desktop/tecmint/tecmint1.txt /home/tecmint/Desktop/tecmint/tecmint15.txt /home/tecmint/Desktop/tecmint/tecmint12.txt
5. 하위 디렉터리까지 포함해 크기 확인하기 (-S + -r 옵션)
-S 옵션과 -r 옵션을 함께 사용하면 모든 디렉터리와 하위 디렉터리에서 발견된 중복 파일의 크기를 확인할 수 있습니다.
$ fdupes -Sr /home/avi/Desktop/ 65 bytes each: /home/tecmint/Desktop/tecmint/tecmint13.txt /home/tecmint/Desktop/tecmint/tecmint8.txt /home/tecmint/Desktop/tecmint/tecmint11.txt /home/tecmint/Desktop/tecmint/tecmint3.txt /home/tecmint/Desktop/tecmint/tecmint4.txt /home/tecmint/Desktop/tecmint/tecmint6.txt /home/tecmint/Desktop/tecmint/tecmint7.txt /home/tecmint/Desktop/tecmint/tecmint9.txt /home/tecmint/Desktop/tecmint/tecmint10.txt /home/tecmint/Desktop/tecmint/tecmint2.txt /home/tecmint/Desktop/tecmint/tecmint5.txt /home/tecmint/Desktop/tecmint/tecmint14.txt /home/tecmint/Desktop/tecmint/tecmint1.txt /home/tecmint/Desktop/tecmint/tecmint15.txt /home/tecmint/Desktop/tecmint/tecmint12.txt 107 bytes each: /home/tecmint/Desktop/resume_files/r-csc.html /home/tecmint/Desktop/resume_files/fc.html
6. 여러 폴더를 동시에 검색하기
한 폴더만 검색하거나 전체를 재귀적으로 검색하는 것 외에도, 필요에 따라 두세 개의 폴더를 지정해 동시에 검색할 수 있습니다. 물론 -S, -r 옵션도 함께 사용할 수 있습니다.
$ fdupes /home/avi/Desktop/ /home/avi/Templates/
7. 중복 파일 삭제하기 (-d 옵션)
-d 옵션을 사용하면 각 그룹에서 보관할 파일 하나를 남기고 나머지 중복 파일을 삭제할 수 있습니다. 단, 실수로 필요한 파일까지 삭제할 수 있으므로 각별히 주의해야 하며, 삭제된 데이터는 복구가 불가능합니다.
$ fdupes -d /home/$USER/Desktop/tecmint [1] /home/tecmint/Desktop/tecmint/tecmint13.txt [2] /home/tecmint/Desktop/tecmint/tecmint8.txt [3] /home/tecmint/Desktop/tecmint/tecmint11.txt [4] /home/tecmint/Desktop/tecmint/tecmint3.txt [5] /home/tecmint/Desktop/tecmint/tecmint4.txt [6] /home/tecmint/Desktop/tecmint/tecmint6.txt [7] /home/tecmint/Desktop/tecmint/tecmint7.txt [8] /home/tecmint/Desktop/tecmint/tecmint9.txt [9] /home/tecmint/Desktop/tecmint/tecmint10.txt [10] /home/tecmint/Desktop/tecmint/tecmint2.txt [11] /home/tecmint/Desktop/tecmint/tecmint5.txt [12] /home/tecmint/Desktop/tecmint/tecmint14.txt [13] /home/tecmint/Desktop/tecmint/tecmint1.txt [14] /home/tecmint/Desktop/tecmint/tecmint15.txt [15] /home/tecmint/Desktop/tecmint/tecmint12.txt Set 1 of 1, preserve files [1 - 15, all]:
모든 중복 파일이 나열되고, 하나씩 삭제하거나 특정 범위를 지정하거나 한 번에 모두 삭제할지 묻는 프롬프트가 나타납니다. 예를 들어 아래처럼 범위를 지정하면 해당 번호의 파일들만 삭제됩니다.
Set 1 of 1, preserve files [1 - 15, all]: 2-15 [-] /home/tecmint/Desktop/tecmint/tecmint13.txt [+] /home/tecmint/Desktop/tecmint/tecmint8.txt [-] /home/tecmint/Desktop/tecmint/tecmint11.txt [-] /home/tecmint/Desktop/tecmint/tecmint3.txt [-] /home/tecmint/Desktop/tecmint/tecmint4.txt [-] /home/tecmint/Desktop/tecmint/tecmint6.txt [-] /home/tecmint/Desktop/tecmint/tecmint7.txt [-] /home/tecmint/Desktop/tecmint/tecmint9.txt [-] /home/tecmint/Desktop/tecmint/tecmint10.txt [-] /home/tecmint/Desktop/tecmint/tecmint2.txt [-] /home/tecmint/Desktop/tecmint/tecmint5.txt [-] /home/tecmint/Desktop/tecmint/tecmint14.txt [-] /home/tecmint/Desktop/tecmint/tecmint1.txt [-] /home/tecmint/Desktop/tecmint/tecmint15.txt [-] /home/tecmint/Desktop/tecmint/tecmint12.txt
8. 결과를 파일로 저장해 안전하게 검토하기
안전을 위해 fdupes의 출력 결과를 텍스트 파일로 저장한 뒤, 어떤 파일을 삭제할지 미리 검토하는 방법을 추천합니다. 이렇게 하면 파일을 실수로 삭제할 위험을 크게 줄일 수 있습니다.
$ fdupes -Sr /home > /home/fdupes.txt
참고: '/home' 부분은 원하는 폴더 경로로 바꿔 사용하세요. '-r'은 재귀적 검색, '-S'는 파일 크기 출력 옵션입니다.
9. 각 그룹의 첫 번째 파일 제외하고 표시하기 (-f 옵션)
-f 옵션을 사용하면 각 중복 그룹에서 첫 번째 파일을 결과에서 생략할 수 있습니다. 먼저 디렉터리의 파일 목록을 확인해 보겠습니다.
$ ls -l /home/$USER/Desktop/tecmint total 20 -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (3rd copy).txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (4th copy).txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (another copy).txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (copy).txt -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt
그다음 -f 옵션으로 첫 번째 파일을 제외한 나머지만 표시합니다.
$ fdupes -f /home/$USER/Desktop/tecmint /home/tecmint/Desktop/tecmint9 (copy).txt /home/tecmint/Desktop/tecmint9 (3rd copy).txt /home/tecmint/Desktop/tecmint9 (another copy).txt /home/tecmint/Desktop/tecmint9 (4th copy).txt
10. 설치된 fdupes 버전 확인하기
$ fdupes --version fdupes 1.51
11. 도움말 보기 (-h 옵션)
fdupes 사용에 도움이 필요하면 '-h' 옵션을 사용하세요.
$ fdupes -h
Usage: fdupes [options] DIRECTORY...
-r --recurse 지정한 모든 디렉터리의 하위 디렉터리까지 탐색
-R --recurse: 이 옵션 이후에 지정한 디렉터리만 하위 디렉터리까지 탐색
(옵션 끝의 ':'에 유의, 자세한 내용은 manpage 참조)
-s --symlinks 심볼릭 링크 따라가기
-H --hardlinks 같은 디스크 영역을 가리키는 파일들을 기본적으로
중복으로 처리하지 않으나, 이 옵션으로 동작 변경 가능
-n --noempty 크기가 0인 파일 제외
-A --nohidden 숨김 파일 제외
-f --omitfirst 각 중복 그룹의 첫 번째 파일 생략
-1 --sameline 각 중복 그룹을 한 줄로 표시
-S --size 중복 파일의 크기 표시
-m --summarize 중복 정보 요약 표시
-q --quiet 진행 표시줄 숨기기
-d --delete 보관할 파일을 선택하고 나머지 삭제
(주의: -s/--symlinks와 함께 사용하거나 같은 디렉터리를
여러 번 지정하면 데이터가 손실될 수 있음)
-N --noprompt --delete와 함께 사용 시, 각 그룹의 첫 번째 파일을
보관하고 나머지를 사용자 확인 없이 삭제
-v --version fdupes 버전 표시
-h --help 도움말 표시마무리
지금까지 리눅스에서 중복 파일을 찾고 삭제하는 fdupes의 핵심 기능과 다양한 옵션을 살펴보았습니다. 여러분은 지금까지 어떤 방법으로 중복 파일을 정리해 왔는지, 그리고 이 유틸리티에 대한 생각은 어떤지 댓글로 의견을 나눠주세요. 공유와 좋아요도 잊지 말아주세요!
참고로, 중복 파일을 제거하는 또 다른 유틸리티인 fslint에 대한 글도 준비 중이니 많은 기대 부탁드립니다.