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 강좌 / APT와 DNF로 패키지 설치·업데이트하기

Linux 강좌 / APT와 DNF로 패키지 설치·업데이트하기

Debian·Ubuntu의 APT와 Rocky Linux의 DNF로 패키지를 검색·설치·업데이트·제거하는 방법을 비교합니다. 저장소와 의존성, 업데이트 전 확인할 항목을 다룹니다.

Linux / 명령어 / chown - 파일 소유자와 그룹 변경

Linux / 명령어 / chown - 파일 소유자와 그룹 변경

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

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

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

Linux / 명령어 / fg - 셸 작업을 포그라운드로 가져오기

Linux / 명령어 / fg - 셸 작업을 포그라운드로 가져오기

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

Linux / 명령어 / top - 프로세스 자원 사용량 실시간 확인

Linux / 명령어 / top - 프로세스 자원 사용량 실시간 확인

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

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

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

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

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

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

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

Linux / 명령어 / more - 텍스트를 화면 단위로 나누어 보기

Linux / 명령어 / more - 텍스트를 화면 단위로 나누어 보기

Linux more 명령어로 긴 텍스트를 화면 단위로 읽는 방법을 설명합니다. 이동과 검색 키, 파이프 사용법, less와의 차이를 함께 정리합니다.

Linux / 명령어 / fold - 긴 행을 지정한 너비로 나누기

Linux / 명령어 / fold - 긴 행을 지정한 너비로 나누기

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

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

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

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