Linux / 명령어 / diff - 텍스트 파일과 디렉터리 차이 비교

diff는 두 텍스트 파일 또는 디렉터리를 비교해 서로 다른 부분을 보여 주는 명령입니다. 특히 -u의 unified diff 형식은 변경 전후 문맥을 함께 제공해 패치와 코드 리뷰에 널리 사용됩니다.

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

diff 명령어란?

첫 번째 입력을 두 번째 입력으로 바꾸기 위한 차이를 줄 단위로 계산합니다. 출력이 없으면 차이가 없다는 뜻이며, 종료 상태 0은 동일, 1은 차이 있음, 2 이상은 오류를 나타내는 것이 일반적입니다. 따라서 차이가 있다는 상태 1을 무조건 실행 실패로 취급하지 않아야 합니다.

기본 문법

diff [옵션] 파일1 파일2
diff [옵션] 디렉터리1 디렉터리2

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

diff 기본 사용법

두 파일 비교하기

기본 출력은 변경 명령 형태로 표시됩니다.

diff old.conf new.conf

unified 형식으로 비교하기

변경 줄 앞뒤의 문맥이 함께 표시되어 사람이 읽기 쉽습니다.

diff -u old.conf new.conf

디렉터리 재귀 비교하기

-r은 대응하는 하위 경로까지 비교합니다.

diff -ru project-old project-new

변경 표시와 종료 상태 읽기

diff -u는 두 파일의 다른 줄을 통합 형식으로 보여줍니다. 아래 예제에서는 첫 파일의 old가 둘째 파일의 new로 바뀌었습니다.

printf 'old\n' > before.txt
printf 'new\n' > after.txt
diff -u before.txt after.txt

출력의 핵심 부분(파일 헤더의 시각은 생략):

-old
+new

-는 첫 파일에만 있는 줄, +는 둘째 파일에만 있는 줄입니다. 두 파일이 다르면 종료 상태 1이므로, 이를 실행 실패 상태 2와 구분하세요.

주요 옵션

옵션 설명
-u unified 형식으로 문맥과 차이를 출력합니다.
-r, --recursive 하위 디렉터리를 재귀적으로 비교합니다.
-q, --brief 상세 차이 대신 서로 다른지 여부만 보고합니다.
-s, --report-identical-files 동일한 파일도 명시적으로 보고합니다.
-w, --ignore-all-space 모든 공백 차이를 무시합니다.
-b, --ignore-space-change 연속 공백 양의 차이를 무시합니다.
-i, --ignore-case 대소문자 차이를 무시합니다.
--color=auto 지원되는 GNU 버전에서 터미널 출력에 색상을 적용합니다.

실전 활용 예제

패치 파일 만들기

기준 디렉터리에서 재현 가능한 상대 경로를 사용해 unified diff를 저장합니다.

diff -u original.conf modified.conf > config.patch

디렉터리 변경 요약하기

파일 내용 전체가 필요 없으면 -qr로 다른 파일과 한쪽에만 있는 경로를 요약합니다.

diff -qr release-a release-b

공백 차이를 제외하고 검토하기

공백이 의미 없는 경우에만 사용합니다. Python처럼 들여쓰기가 의미 있는 언어에는 결과를 신중히 해석합니다.

diff -u -b before.txt after.txt

diff와 관련 명령 비교

명령 주요 역할 적합한 상황
diff 줄 단위 텍스트 차이 설정·소스·디렉터리 비교
cmp 바이트 단위 첫 차이 동일 여부와 오프셋 확인
git diff 저장소 변경 비교 Git 작업 트리와 커밋
comm 정렬된 두 파일의 집합 비교 공통·고유 줄 분리

사용할 때 주의할 점

종료 상태 1은 차이가 있다는 뜻입니다

스크립트에서 단순 오류로 처리하면 정상적인 비교 결과를 실패로 오해할 수 있습니다.

바이너리 파일에는 상세 줄 비교가 적합하지 않습니다

바이너리 동일 여부는 cmp나 체크섬 도구가 더 명확합니다.

공백 무시는 실제 차이를 숨길 수 있습니다

형식이나 들여쓰기가 의미 있는 파일에는 무시 옵션을 함부로 적용하지 않습니다.

FAQ

diff 출력이 없으면 무엇을 뜻하나요?

두 입력에서 보고할 차이가 없다는 뜻입니다.

가장 읽기 쉬운 출력 형식은 무엇인가요?

일반적으로 diff -u의 unified 형식이 문맥을 함께 보여 줘 읽기 쉽습니다.

디렉터리 전체도 비교할 수 있나요?

-r로 하위 디렉터리를 재귀 비교할 수 있습니다.

diff가 종료 코드 1을 반환하면 오류인가요?

아닙니다. 보통 차이가 발견됐다는 정상 결과이며 실제 오류는 2 이상입니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 리눅스 디렉토리 구조와 주요 디렉토리별 용도

Linux / 리눅스 디렉토리 구조와 주요 디렉토리별 용도

리눅스의 /etc, /var, /usr, /home, /proc, /dev 등 주요 디렉토리별 용도와 이름의 의미를 정리합니다. 리눅스 파일시스템 구조를 처음 배우거나 서버 관리에 필요한 디렉토리를 확인할 때 참고할 수 있습니다.

Linux / 명령어

Linux / 명령어

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

Linux / 명령어 / killall - 이름이 같은 프로세스에 시그널 보내기

Linux / 명령어 / killall - 이름이 같은 프로세스에 시그널 보내기

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

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

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

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

Linux / 명령어 / passwd - 사용자 비밀번호 변경

Linux / 명령어 / passwd - 사용자 비밀번호 변경

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

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

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

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

Linux / 리눅스 배포판 종류와 버전 확인하는 방법

Linux / 리눅스 배포판 종류와 버전 확인하는 방법

리눅스 배포판 종류와 버전을 /etc/os-release, hostnamectl, uname 명령으로 확인하는 방법을 설명합니다. 배포판 계열과 커널 버전의 차이, 스크립트 활용법과 컨테이너·WSL 환경의 주의점도 함께 정리합니다.

Linux / 명령어 / dirname - 경로에서 디렉터리 부분 추출

Linux / 명령어 / dirname - 경로에서 디렉터리 부분 추출

Linux dirname 명령어로 경로의 디렉터리 부분을 추출하는 방법을 설명합니다. 입력 형태별 결과와 basename, realpath의 차이 및 셸 스크립트 활용법을 정리합니다.

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

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

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

Linux / 명령어 / info - GNU 문서 확인

Linux / 명령어 / info - GNU 문서 확인

info 명령어로 GNU 설명서를 탐색하는 방법을 설명합니다. 노드와 메뉴 이동, 본문·색인 검색, 특정 문서 위치 지정, 텍스트 출력과 문서가 없을 때의 해결 방법을 정리합니다.