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의 출력과 두 명령의 종료 상태를 확인할 수 있습니다.









