리눅스 시스템을 사용하다 보면 파일이나 디렉토리를 비교해야 하는 상황이 자주 발생합니다. 소스 코드 변경사항 확인, 백업 검증, 설정 파일 관리 등 다양한 상황에서 비교 명령어는 필수적인 도구입니다. 이 글에서는 리눅스에서 사용할 수 있는 다양한 파일 및 디렉토리 비교 명령어들의 기능, 옵션, 그리고 실제 사용 예시를 자세히 살펴보겠습니다.

 

1. diff: 파일 내용 비교의 기본

diff 명령어는 리눅스에서 가장 기본적인 파일 비교 도구로, 두 파일 간의 차이점을 행 단위로 보여줍니다. 원본 파일과 수정된 파일 간의 변경 사항을 확인할 때 매우 유용합니다.

기본 사용법

가장 기본적인 사용법은 두 파일의 이름을 인자로 전달하는 것입니다:

diff file1.txt file2.txt

이 명령은 두 파일 간의 차이점을 출력합니다. 차이가 없으면 아무 것도 출력되지 않습니다.

주요 옵션

  • -b: 공백 차이 무시
  • -B: 빈 줄 차이 무시
  • -i: 대소문자 차이 무시
  • -w: 모든 공백 차이 무시
  • -y: 두 파일을 나란히 비교하여 표시
  • -u: 통합 형식(unified format)으로 출력
  • -r: 디렉토리를 재귀적으로 비교
  • -q: 간단히 파일이 다른지만 보고
  • -c: 컨텍스트 형식으로 출력
  • --color: 차이점을 색상으로 강조

사용 예시

1) 기본적인 두 파일 비교

두 파일의 차이점을 확인하는 가장 기본적인 방법입니다:

diff original.txt modified.txt

2) 옆으로 나란히 비교 출력

두 파일을 나란히 배치하여 비교하면 차이점을 더 쉽게 확인할 수 있습니다:

diff -y file1.txt file2.txt

3) 통합 형식으로 출력

Git과 같은 버전 관리 시스템에서 흔히 볼 수 있는 형식으로, 변경 내용의 맥락을 더 잘 이해할 수 있습니다:

diff -u original.txt modified.txt

4) 디렉토리 재귀적 비교

두 디렉토리의 모든 파일을 비교할 때 유용합니다:

diff -r dir1/ dir2/

5) 공백과 빈 줄 무시하기

코드 비교 시 포매팅 차이만 무시하고 실질적인 내용 차이를 보고 싶을 때 사용합니다:

diff -Bbw file1.txt file2.txt

 

2. cmp: 바이트 단위 비교

cmp 명령어는 diff와 달리 두 파일을 바이트 단위로 비교합니다. 텍스트 뿐만 아니라 바이너리 파일 비교에도 유용합니다.

기본 사용법

cmp file1 file2

이 명령은 첫 번째 차이점이 발견된 위치만 출력합니다. 파일이 동일하면 아무 출력도 없습니다.

주요 옵션

  • -b: 바이트 오프셋 출력
  • -i N: 처음 N 바이트 무시
  • -l: 모든 차이점의 바이트 위치와 값 출력
  • -s: 묵묵히 실행하고 종료 상태만 반환
  • -v: 버전 정보 출력

사용 예시

1) 기본 비교

두 파일의 첫 번째 차이점이 발생하는 위치만 알고 싶을 때 사용합니다:

cmp document1.pdf document2.pdf

2) 모든 차이점 출력

두 파일 간의 모든 바이트 차이를 확인하고 싶을 때 유용합니다:

cmp -l binary1 binary2

3) 종료 상태만 확인

스크립트에서 파일이 동일한지만 확인하고 싶을 때 유용합니다:

cmp -s file1 file2
if [ $? -eq 0 ]; then
    echo "Files are identical"
else
    echo "Files are different"
fi

 

3. comm: 정렬된 파일 비교

comm 명령어는 정렬된 두 파일을 비교하여 공통 줄과 고유 줄을 확인할 수 있게 해줍니다. 두 데이터 세트의 교집합, 차집합을 확인할 때 매우 유용합니다.

기본 사용법

comm file1.txt file2.txt

이 명령은 세 개의 열로 출력합니다:

  1. 첫 번째 파일에만 있는 줄
  2. 두 번째 파일에만 있는 줄
  3. 양쪽 파일에 모두 있는 줄

주요 옵션

  • -1: 첫 번째 열(첫 번째 파일에만 있는 줄) 생략
  • -2: 두 번째 열(두 번째 파일에만 있는 줄) 생략
  • -3: 세 번째 열(두 파일에 공통으로 있는 줄) 생략
  • --check-order: 입력이 정렬되었는지 확인
  • --nocheck-order: 입력이 정렬되었는지 확인하지 않음
  • --output-delimiter=STR: 열 구분자 지정

사용 예시

1) 기본 비교

두 파일의 공통 줄과 고유 줄을 확인할 때 사용합니다. 사용 전 파일이 정렬되어 있어야 합니다:

sort file1.txt > sorted1.txt
sort file2.txt > sorted2.txt
comm sorted1.txt sorted2.txt

2) 첫 번째 파일에만 있는 줄 표시

목록 A에는 있지만 목록 B에는 없는 항목을 찾을 때 유용합니다:

comm -23 sorted1.txt sorted2.txt

3) 두 파일의 공통 줄만 표시

두 데이터 세트의 교집합을 찾을 때 사용합니다:

comm -12 sorted1.txt sorted2.txt

4) 사용자 정의 구분자 사용

출력을 더 읽기 쉽게 만들 때 유용합니다:

comm --output-delimiter=", " sorted1.txt sorted2.txt

 

4. rsync: 효율적인 파일 동기화

rsync는 단순한 비교 도구를 넘어 파일과 디렉토리를 효율적으로 동기화하는 강력한 도구입니다. 네트워크를 통한 백업과 미러링에 특히 유용합니다.

기본 사용법

rsync [옵션] 소스 대상

주요 옵션

  • -a: 아카이브 모드(권한, 소유권, 타임스탬프 등 보존)
  • -v: 자세한 출력
  • -r: 재귀적으로 디렉토리 복사
  • -n 또는 --dry-run: 실제로 파일을 복사하지 않고 어떤 작업이 수행될지 보여줌
  • -z: 전송 중 압축
  • -h: 사람이 읽기 쉬운 형식으로 출력
  • --delete: 소스에 없는 파일을 대상에서 삭제
  • --progress: 진행 상황 표시
  • -c 또는 --checksum: 체크섬 기반으로 파일 비교
  • -u 또는 --update: 소스 파일이 더 새로운 경우에만 업데이트

사용 예시

1) 기본 디렉토리 동기화

한 디렉토리의 내용을 다른 디렉토리로 복사하면서 변경된 파일만 업데이트합니다:

rsync -av source_dir/ destination_dir/

2) 원격 시스템과 동기화

SSH를 통해 원격 서버와 파일을 동기화할 때 유용합니다:

rsync -avz -e ssh local_dir/ user@remote_host:remote_dir/

3) 시뮬레이션 실행

실제 동기화 전에 어떤 파일이 변경될지 미리 확인할 수 있습니다:

rsync -avnz source_dir/ destination_dir/

4) 체크섬 기반 비교

타임스탬프가 아닌 실제 파일 내용에 기반한 동기화가 필요할 때 유용합니다:

rsync -avc source_dir/ destination_dir/

5) 백업 생성

소스와 동일한 디렉토리 구조의 백업을 만들고, 소스에 없는 파일을 대상에서 삭제합니다:

rsync -av --delete source_dir/ backup_dir/

 

5. vimdiff: 시각적 파일 비교 및 편집

vimdiff는 Vim 텍스트 에디터를 기반으로 한 명령어로, 두 파일을 나란히 비교하고 동시에 편집할 수 있게 해줍니다.

기본 사용법

vimdiff file1 file2 [file3 [file4]]

또는:

vim -d file1 file2 [file3 [file4]]

주요 단축키

  • do: 다른 창에서 현재 창으로 변경사항 가져오기 (diff obtain)
  • dp: 현재 창에서 다른 창으로 변경사항 보내기 (diff put)
  • :diffupdate: 차이점 표시 업데이트
  • :qa: 모든 창 닫기

사용 예시

코드 파일이나 설정 파일을 비교하면서 직접 편집하고 싶을 때 매우 유용합니다:

vimdiff config.original.ini config.modified.ini

 

6. colordiff: 색상으로 강조된 diff

colordiffdiff의 출력에 색상을 추가하여 가독성을 높여주는 도구입니다.

기본 사용법

colordiff file1 file2

또는 파이프라인으로 사용:

diff file1 file2 | colordiff

사용 예시

큰 파일을 비교할 때 차이점을 시각적으로 더 쉽게 식별할 수 있습니다:

colordiff -u original.conf modified.conf

 

7. meld: GUI 기반 파일 및 디렉토리 비교

meld는 그래픽 인터페이스를 제공하는 비교 도구로, 복잡한 차이점을 시각적으로 이해하기 쉽게 해줍니다.

기본 사용법

meld file1 file2

또는 디렉토리 비교:

meld dir1 dir2

사용 예시

GUI 환경에서 작업할 때 파일 간의 차이점을 시각적으로 확인하고 수정하는 데 유용합니다:

meld project_v1/ project_v2/

 

8. 유용한 명령어 조합

여러 명령어를 조합하면 더 강력한 비교 및 분석이 가능합니다.

diff와 grep 조합

특정 패턴과 관련된 차이점만 찾을 때 유용합니다:

diff -u file1.txt file2.txt | grep "specific_pattern"

diff와 less 조합

대용량 파일의 차이점을 페이지 단위로 볼 때 편리합니다:

diff -u file1.txt file2.txt | less

comm과 sort 조합

정렬되지 않은 파일의 공통 줄을 찾을 때 활용합니다:

sort file1.txt | comm -12 - <(sort file2.txt)

rsync와 find 조합

특정 유형의 파일만 동기화할 때 사용합니다:

find source_dir -name "*.jpg" -print0 | rsync -av --files-from=- --from0 source_dir/ destination_dir/

cmp와 for 루프 조합

여러 파일을 원본과 비교할 때 활용합니다:

for file in dir2/*; do
    basename=$(basename "$file")
    if [ -f "dir1/$basename" ]; then
        cmp -s "dir1/$basename" "$file" || echo "$basename differs"
    fi
done

 

9. 명령어 사용 시 주의사항

diff와 cmp 사용 시 주의사항

  • 바이너리 파일을 diff로 비교하면 가독성이 떨어지고 의미 있는 결과를 얻기 어려울 수 있습니다. 이런 경우 cmp를 사용하세요.
  • 대용량 파일 비교 시 시스템 리소스를 많이 사용할 수 있으니 주의가 필요합니다.

comm 사용 시 주의사항

  • 반드시 정렬된 파일을 입력으로 사용해야 정확한 결과를 얻을 수 있습니다.
  • 대소문자 구분에 주의해야 합니다. 필요하다면 sort -f로 정렬하세요.

rsync 사용 시 주의사항

  • --delete 옵션은 신중하게 사용해야 합니다. 잘못 사용하면 중요한 파일이 삭제될 수 있습니다.
  • 항상 --dry-run 옵션으로 먼저 테스트한 후 실행하는 것이 안전합니다.
  • 슬래시(/)의 사용에 주의하세요. source_dir/source_dir는 다른 동작을 합니다.

 

10. 마무리하며… (각 명령어 간단 정리)

리눅스의 파일 및 디렉토리 비교 명령어들은 각각 고유한 특징과 용도를 가지고 있습니다.

  • diff는 텍스트 파일의 라인별 차이를 비교하는 기본 도구
  • cmp는 바이트 수준에서 파일을 비교하는 저수준 도구
  • comm은 정렬된 파일의 공통 부분과 고유 부분을 식별하는 도구
  • rsync는 효율적인 파일 동기화와 백업을 위한 강력한 도구
  • vimdiff, colordiff, meld 등은 보다 직관적인 비교를 위한 확장 도구

작업의 성격과 필요에 따라 적합한 도구를 선택하고, 필요시 여러 도구를 조합하여 사용하면 효율적인 파일 관리가 가능합니다. 이러한 명령어들의 능숙한 활용은 시스템 관리, 소프트웨어 개발, 데이터 분석 등 다양한 분야에서 작업 효율을 크게 향상시킬 수 있습니다.

 

댓글 남기기