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 / 명령어 / journalctl - systemd 시스템·서비스 로그 조회

Linux / 명령어 / journalctl - systemd 시스템·서비스 로그 조회

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

Linux / 명령어 / tree - 디렉터리 구조를 트리 형태로 출력

Linux / 명령어 / tree - 디렉터리 구조를 트리 형태로 출력

Linux tree 명령어로 디렉터리와 파일 구조를 계층적으로 확인하는 방법을 설명합니다. 설치, 깊이 제한, 숨김 파일, 제외 패턴, 크기·권한 표시와 JSON 저장 방법까지 정리합니다.

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

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

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

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

whatis 명령어로 매뉴얼 페이지의 한 줄 설명과 섹션을 확인하는 방법을 설명합니다. 정규 표현식·와일드카드 검색, apropos·type과의 차이 및 색인 문제 해결법을 정리합니다.

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

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

Linux / 명령어 / printenv - 환경 변수 값 출력

Linux / 명령어 / printenv - 환경 변수 값 출력

Linux printenv 명령어로 전체 또는 특정 환경 변수 값을 확인하는 방법을 설명합니다. 셸 변수와 환경 변수의 차이, 종료 상태, NUL 구분 출력과 env와의 차이를 정리합니다.

Linux / 명령어

Linux / 명령어

리눅스에서 자주 사용하는 명령어를 파일, 텍스트, 권한, 프로세스, 시스템, 디스크, 네트워크와 패키지 관리 작업별로 정리했습니다. 링크가 있는 명령어는 자세한 사용법과 예제를 확인할 수 있습니다.

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

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

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

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

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

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

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

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

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