Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

두 파일에서 어느 줄이 어떻게 바뀌었는지 보려면 diff, 바이트 단위로 같은지 빠르게 판별하려면 cmp를 사용합니다. 두 명령 모두 파일이 다르면 보통 종료 상태 1을 반환하며, 이는 명령 자체의 오류를 뜻하는 상태 2와 다릅니다. 이 강좌에서는 작은 파일 두 개로 출력과 종료 상태를 함께 읽어 봅니다.

비교할 파일 준비하기

아래 실습은 Bash와 GNU Diffutils를 기준으로 합니다. ~/linux-course-13-practice가 이미 있으면 다른 이름을 정하세요. 첫 mkdir가 실패했다면 이어지는 파일 생성 명령을 실행하지 마세요. >는 기존 파일을 덮어쓸 수 있습니다.

mkdir ~/linux-course-13-practice
cd ~/linux-course-13-practice
pwd

위치가 맞다면 두 파일을 만듭니다. 둘째 줄만 beta와 BETA로 다릅니다.

printf 'alpha\nbeta\ngamma\n' > old.txt
printf 'alpha\nBETA\ngamma\n' > new.txt

diff로 줄의 변경 내용 읽기

diff는 줄 단위의 차이를 보여 줍니다. -u는 주변의 변하지 않은 줄까지 함께 표시하는 통합 형식입니다. GNU diff의 --label을 사용하면 파일 수정 시각 대신 일정한 머리말을 붙여 예제를 읽기 쉽게 만들 수 있습니다.

diff -u --label old --label new old.txt new.txt

이 실습의 출력은 다음과 같습니다.

--- old
+++ new
@@ -1,3 +1,3 @@
 alpha
-beta
+BETA
 gamma

---는 이전 파일, +++는 새 파일을 나타냅니다. @@ 행은 비교 중인 줄 범위를, 앞에 -가 붙은 줄은 이전 내용, +가 붙은 줄은 새 내용을 뜻합니다. 앞에 공백이 있는 줄은 두 파일에서 같습니다. 이름이 비슷하다고 해서 어느 파일이 ‘원본’인지 diff가 판단하는 것은 아닙니다. 명령 인수의 순서가 비교 방향을 정합니다.

cmp로 첫 바이트 차이 확인하기

cmp는 파일을 바이트 단위로 비교하며, 기본 출력은 첫 차이가 발견된 위치를 알려 줍니다. 이 예제에서는 첫 줄 alpha와 줄바꿈 다음, 둘째 줄의 첫 글자가 달라집니다.

cmp old.txt new.txt

영어 로캘의 GNU cmp에서는 old.txt new.txt differ: byte 7, line 2처럼 나올 수 있습니다. 파일 이름과 언어 설정에 따라 문구는 달라져도 첫 차이가 둘째 줄에 있다는 뜻은 같습니다. cmp는 이후의 모든 차이를 나열하는 도구가 아닙니다.

출력 없이 같고 다름만 알고 싶다면 -s를 붙인 뒤 바로 종료 상태를 확인하세요. 아래 명령은 실습 파일이 다르므로 1을 출력합니다. $?는 직전에 실행한 명령의 종료 상태이므로 사이에 다른 명령을 넣으면 결과가 달라집니다.

cmp -s old.txt new.txt
echo $?

차이가 있다는 결과와 실행 오류 구별하기

종료 상태 diff·cmp에서의 일반적인 뜻 다음 행동
0 차이 없음 비교 대상과 기준이 맞는지 확인
1 차이 발견 diff 출력으로 바뀐 부분 확인
2 파일 접근 실패 등 문제 경로·권한·오류 메시지 확인

바이트가 같은지 여부는 cmp, 텍스트 변경 내용을 읽는 일은 diff -u가 적합합니다. 줄 끝 형식이나 인코딩이 다르면 눈으로 비슷해 보여도 차이가 날 수 있습니다. 바이너리 파일은 텍스트 diff가 유용한 설명을 제공하지 못할 수 있으므로 cmp로 동일성부터 확인하세요. 디렉터리 트리를 비교해야 한다면 GNU diff -r을 사용할 수 있지만 대상 범위가 넓어지므로 경로를 먼저 확인해야 합니다.

공식 문서

GNU Diffutils 공식 매뉴얼에서 통합 diff 형식, cmp의 출력과 두 명령의 종료 상태를 확인할 수 있습니다.

같은 카테고리의 다른 글
Linux 강좌 / 파일 시스템 이해하기 - 절대·상대 경로와 주요 디렉터리

Linux 강좌 / 파일 시스템 이해하기 - 절대·상대 경로와 주요 디렉터리

리눅스 파일 시스템의 트리 구조와 절대·상대 경로를 이해하고, /home·/etc·/var 등 주요 디렉터리의 역할과 경로를 읽는 방법을 익힙니다.

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

diff와 cmp로 두 파일의 차이를 확인하고 unified diff를 읽는 법을 익힙니다. 내용이 다른 경우와 명령 실행 오류의 종료 상태도 구별합니다.

Linux 강좌 / 텍스트 검색과 가공 - grep, sort, uniq, cut, wc

Linux 강좌 / 텍스트 검색과 가공 - grep, sort, uniq, cut, wc

grep, sort, uniq, cut, wc로 텍스트를 찾고 정렬·중복 제거·필드 추출·개수 세기를 실습합니다. 명령 결과와 흔한 해석 오류도 설명합니다.

Linux / 명령어 / umount - 파일 시스템을 안전하게 분리

Linux / 명령어 / umount - 파일 시스템을 안전하게 분리

Linux umount 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

find와 locate로 파일을 찾고 which, whereis, type으로 명령의 위치와 해석 방식을 확인합니다. 실시간 검색과 색인 검색의 차이도 짚습니다.

Linux / 명령어 / ssh-copy-id - SSH 공개키를 원격 계정에 등록

Linux / 명령어 / ssh-copy-id - SSH 공개키를 원격 계정에 등록

Linux ssh-copy-id 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / cd - 디렉터리 이동

Linux / 명령어 / cd - 디렉터리 이동

Linux cd 명령어로 절대·상대 경로, 홈과 이전 디렉터리로 이동하는 방법을 설명합니다. 심볼릭 링크 처리, CDPATH, 스크립트와 sudo cd의 한계 및 오류 해결법도 정리합니다.

Linux / 명령어 / last - 로그인 기록과 시스템 부팅 이력 확인

Linux / 명령어 / last - 로그인 기록과 시스템 부팅 이력 확인

Linux last 명령어로 사용자 로그인·로그아웃, 재부팅과 실패한 로그인 이력을 확인하는 방법을 설명합니다. wtmp·btmp, 기간 필터, 상태 해석과 보안 조사 시 한계를 함께 정리합니다.

Linux 강좌 / 표준 입력·출력, 리디렉션과 파이프 이해하기

Linux 강좌 / 표준 입력·출력, 리디렉션과 파이프 이해하기

표준 입력·출력·오류의 차이를 이해하고 파일 리디렉션과 파이프를 실습합니다. 덮어쓰기 위험과 리디렉션 순서도 함께 설명합니다.

Linux / 명령어 / uptime - 시스템 가동 시간과 부하 확인

Linux / 명령어 / uptime - 시스템 가동 시간과 부하 확인

Linux uptime 명령어의 가동 시간과 1분·5분·15분 평균 부하를 읽는 방법을 설명합니다. CPU 개수, I/O 대기와 함께 부하를 진단하는 순서도 정리합니다.