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 / 명령어 / getent - NSS 사용자·그룹·호스트 정보 조회

Linux / 명령어 / getent - NSS 사용자·그룹·호스트 정보 조회

Linux getent 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / groups - 사용자의 그룹 소속 확인

Linux / 명령어 / groups - 사용자의 그룹 소속 확인

Linux groups 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / who - 현재 로그인 세션 확인

Linux / 명령어 / who - 현재 로그인 세션 확인

Linux who 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

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

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

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

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

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

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

Linux / 명령어 / ethtool - 네트워크 링크·드라이버 정보 확인

Linux / 명령어 / ethtool - 네트워크 링크·드라이버 정보 확인

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

Linux / 명령어 / truncate - 파일 크기 줄이기와 늘리기

Linux / 명령어 / truncate - 파일 크기 줄이기와 늘리기

Linux truncate 명령어로 파일 크기를 지정하거나 늘리고 줄이는 방법을 설명합니다. 희소 파일, 상대 크기 조정, 기준 파일과 같은 크기로 맞추는 방법 및 데이터 손실 주의점을 알아봅니다.

Linux 강좌 / 배포판 선택하기

Linux 강좌 / 배포판 선택하기

리눅스 입문과 서버 실습에 Ubuntu와 Rocky Linux 중 무엇을 선택하면 좋을까요? 학습 목표, 패키지 관리 방식과 지원 정책을 기준으로 두 배포판을 비교합니다.

Linux / 명령어 / xargs - 표준 입력을 명령 인수로 전달

Linux / 명령어 / xargs - 표준 입력을 명령 인수로 전달

Linux xargs 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.