Linux / 명령어 / cmp - 두 파일을 바이트 단위로 비교

cmp는 두 파일을 바이트 단위로 비교합니다. 기본적으로 첫 번째 차이를 발견하면 바이트 위치와 줄 번호를 알리고 종료하므로 파일이 완전히 같은지 빠르게 검사하거나 최초 불일치 지점을 찾는 데 적합합니다.

이 글에서는 cmp의 기본 문법과 주요 옵션, 실제 사용 예제, 관련 명령과의 차이, 사용할 때 주의할 점을 설명합니다.

cmp 명령어란?

두 입력을 앞에서부터 비교하며 같으면 출력 없이 종료 상태 0을 반환합니다. 다르면 보통 첫 차이를 보고하고 상태 1, 읽기 오류나 잘못된 인수 등 문제에는 2 이상을 반환합니다. 텍스트의 의미 있는 줄 차이는 diff가 더 읽기 쉽습니다.

기본 문법

cmp [옵션] 파일1 [파일2 [SKIP1 [SKIP2]]]

옵션과 세부 동작은 구현과 버전에 따라 달라질 수 있습니다. 현재 시스템에서는 cmp --help와 man cmp으로 설치된 명령의 설명을 확인하세요.

cmp 기본 사용법

두 파일 비교하기

같으면 아무것도 출력하지 않고, 다르면 첫 차이 위치를 표시합니다.

cmp image-a.bin image-b.bin

출력 없이 동일 여부 검사하기

-s는 메시지를 숨기고 종료 상태만 사용합니다.

cmp -s copy.iso original.iso

처음 몇 바이트만 비교하기

GNU cmp의 -n으로 비교할 최대 바이트 수를 제한합니다.

cmp -n 4096 file-a file-b

처음 다른 바이트 위치 읽기

cmp는 두 파일을 바이트 단위로 비교하고 처음 다른 위치를 알려줍니다. 동일한 파일이면 기본적으로 아무것도 출력하지 않습니다.

printf 'A' > first.bin
printf 'B' > second.bin
cmp first.bin second.bin

예시 출력(문구는 구현에 따라 달라질 수 있음):

first.bin second.bin differ: byte 1, line 1

종료 상태 1은 차이가 있음, 2는 읽기 오류 같은 문제를 뜻합니다. 스크립트에서 화면 출력을 원하지 않으면 cmp -s를 사용하고 종료 상태를 확인하세요.

주요 옵션

옵션 설명
-s, --silent 일반 출력을 생략하고 종료 상태만 반환합니다.
-l, --verbose 서로 다른 모든 바이트의 위치와 값을 출력합니다.
-b, --print-bytes 서로 다른 바이트를 표시 가능한 형태로 함께 보여 줍니다.
-i SKIP 두 입력의 앞부분을 지정한 만큼 건너뜁니다.
-i SKIP1:SKIP2 GNU 구현에서 각 입력의 건너뛸 양을 다르게 지정합니다.
-n LIMIT 최대 LIMIT바이트까지만 비교합니다.

실전 활용 예제

스크립트에서 변경 여부 확인하기

메시지 대신 종료 상태로 분기합니다.

if cmp -s generated.conf current.conf; then
  printf '%s\n' '변경 없음'
else
  printf '%s\n' '파일이 다름'
fi

헤더 영역만 비교하기

파일 형식의 고정 헤더 크기를 알고 있을 때 비교 범위를 제한합니다.

cmp -n 512 disk-a.img disk-b.img

오프셋을 건너뛰고 비교하기

컨테이너 헤더처럼 비교에서 제외할 영역이 있다면 지원되는 skip 구문을 사용합니다.

cmp -i 4096 payload-a.bin payload-b.bin

cmp와 관련 명령 비교

명령 주요 역할 적합한 상황
cmp 바이트 단위 첫 차이 동일 여부와 최초 오프셋
diff 줄 단위 텍스트 차이 사람이 읽는 변경 내용
sha256sum 각 파일의 해시 계산 원격·여러 파일 무결성 비교
comm 정렬된 줄 집합 비교 공통·고유 항목 분리

사용할 때 주의할 점

-l 출력은 매우 커질 수 있습니다

큰 파일에서 차이가 많으면 모든 바이트 차이를 출력하므로 먼저 기본 모드나 -s로 확인합니다.

종료 상태를 구분합니다

1은 파일이 다름, 2 이상은 비교 자체의 오류일 수 있으므로 스크립트에서 따로 처리합니다.

바이트가 같아도 파일 의미까지 검증되는 것은 아닙니다

동일 바이트 여부는 확인하지만 서명, 출처, 파일 형식의 유효성을 검증하지는 않습니다.

FAQ

cmp 출력이 없으면 같은 파일인가요?

명령이 정상 종료했고 상태가 0이라면 비교한 범위의 바이트가 같습니다.

첫 차이 이후도 모두 보려면요?

cmp -l 파일1 파일2를 사용하지만 차이가 많으면 출력이 매우 커질 수 있습니다.

텍스트 파일도 cmp로 비교할 수 있나요?

가능하지만 변경된 줄을 읽기 쉽게 보려면 diff가 더 적합합니다.

체크섬 비교와 무엇이 다른가요?

cmp는 두 파일을 직접 동시에 읽어 비교하고, 체크섬은 각 파일의 요약값을 계산해 서로 다른 위치에서도 비교하기 쉽습니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

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

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.

Linux / 명령어 / whoami - 현재 유효 사용자 이름 확인

Linux / 명령어 / whoami - 현재 유효 사용자 이름 확인

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

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

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

Linux / 명령어 / bzip2 - 파일을 bzip2 형식으로 압축하기

Linux / 명령어 / bzip2 - 파일을 bzip2 형식으로 압축하기

Linux bzip2 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux locate 명령어로 파일 이름 색인을 빠르게 검색하는 방법을 설명합니다. updatedb, 최신성 한계, 패턴과 정규 표현식, find와의 차이를 정리합니다.

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

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

Linux / Memo

Linux / Memo

리눅스와 관련된 여러 정보를 정리합니다.

Linux / 명령어 / ps - 현재 프로세스 상태 확인

Linux / 명령어 / ps - 현재 프로세스 상태 확인

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

Linux / 명령어 / timedatectl - 시간대와 시간 동기화 상태 관리

Linux / 명령어 / timedatectl - 시간대와 시간 동기화 상태 관리

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