diff 명령어: 파일 비교와 diff -u 패치 형식, 옵션 정리

diff 명령어는 두 파일을 줄 단위로 비교해 서로 다른 줄만 출력하는 리눅스 명령어입니다. 웹 서버 설정을 흉내 낸 이전 파일과 새 파일을 diff로 비교해 바뀐 세 곳을 2,3c2,3, 5d4, 6a6 세 줄로 확인했고, -u 옵션으로 저장한 패치 파일에는 같은 변경이 빼기와 더하기 기호로 정리되었습니다.
아래 출력의 파일 이름과 내용, 작업 폴더 /root/work는 예시 값입니다. 비교한 파일은 모두 시험용으로 만든 작은 파일입니다.
1️⃣ diff 명령어 기본 사용법과 출력 읽기
명령의 기본 꼴은 diff, 옵션, 첫 파일, 둘째 파일 순서입니다. 첫 파일을 둘째 파일과 같게 만들려면 어느 줄을 바꾸고 지우고 더해야 하는지를 줄 번호와 함께 출력합니다.
비교에 사용한 두 파일은 웹 서버 설정을 흉내 낸 여섯 줄짜리 파일입니다.
cd /root/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache on두 파일을 옵션 없이 비교했습니다.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1출력에는 위치 줄과 내용 줄이 번갈아 나옵니다. 위치 줄의 가운데 글자 c는 바꿈, d는 지움, a는 더함이고, 글자 왼쪽은 첫 파일, 오른쪽은 둘째 파일의 줄 번호입니다. 다른 곳이 있으면 종료 코드는 1입니다.
| 출력 | 뜻 |
|---|---|
| 2,3c2,3 | 첫 파일 2~3행을 둘째 파일 2~3행으로 바꿈(change) |
| 5d4 | 첫 파일 5행을 지움(delete). 지우면 둘째 파일 4행 다음과 맞음 |
| 6a6 | 첫 파일 6행 뒤에 둘째 파일 6행을 더함(add) |
| < 줄 | 첫 파일에 있는 줄 |
| > 줄 | 둘째 파일에 있는 줄 |
| --- | 바꾸는 줄(c)에서 첫 파일 쪽과 둘째 파일 쪽의 경계 |
내용이 같은 파일을 비교하면 아무것도 출력하지 않고 종료 코드 0으로 끝납니다.
diff config-old.conf config-copy.confecho $?0없는 파일을 주면 오류 문구가 나오고 종료 코드는 2입니다.
diff config-old.conf nosuch.confdiff: nosuch.conf: No such file or directoryecho $?2스크립트에서는 이 세 값으로 같음, 다름, 오류를 구분합니다.
2️⃣ diff -u 통합 형식과 패치 파일
기본 출력에는 바뀐 줄만 나오므로, 줄이 수백 개인 설정 파일에서는 그 줄이 어느 설정 근처인지 찾기 어렵습니다. -u를 붙이면 바뀐 줄 앞뒤 세 줄까지 함께 묶는 통합 형식(unified)으로 출력합니다.
diff -u config-old.conf config-new.conf--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache on머리 두 줄(---, +++)에 두 파일의 이름과 수정 시각이 나오고, @@ -1,6 +1,6 @@ 줄은 첫 파일 1행부터 6줄과 둘째 파일 1행부터 6줄을 묶은 덩어리(hunk)입니다. 그 아래 줄은 맨 앞이 -면 첫 파일에서 지운 줄, +면 둘째 파일에 더한 줄, 공백이면 두 파일에 똑같이 있는 줄입니다.
-c는 문맥 형식(context)입니다. 첫 파일 덩어리와 둘째 파일 덩어리를 따로 출력하고, 바뀐 줄 앞에는 느낌표, 지운 줄에는 빼기, 더한 줄에는 더하기 기호가 붙습니다.
diff -c config-old.conf config-new.conf*** config-old.conf Thu Oct 29 02:24:50 2026
--- config-new.conf Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
# app config
! listen 80
! server_name example.com
root /var/www/html
- gzip off
log_level warn
--- 1,6 ----
# app config
! listen 443
! server_name example.com www.example.com
root /var/www/html
log_level warn
+ cache on같은 변경인데 -c는 그대로인 줄이 두 덩어리에 한 번씩 나와 -u보다 길어졌습니다.
-u 출력을 파일로 저장하면 그 파일이 곧 패치 파일입니다. 출력을 파일로 보내도 diff의 종료 코드는 그대로 1입니다.
diff -u config-old.conf config-new.conf > /root/work/config.patchecho $?1cat /root/work/config.patch--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache on저장한 파일의 내용은 화면에 출력했던 -u 결과와 같습니다. 이 파일을 patch 명령에 넘기면 첫 파일을 둘째 파일과 같은 내용으로 바꿀 수 있습니다.
3️⃣ diff 옵션 정리와 공백, 대소문자 무시
설정을 손으로 옮겨 적으면 내용은 같은데 대소문자나 공백만 다른 줄이 생깁니다. 두 번째 예시 파일은 첫 줄의 대문자 L을 소문자로, 둘째 줄의 공백 한 칸을 두 칸으로 바꾸고 빈 줄 하나를 더했습니다.
cat case-a.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName example.com
>옵션 없이 비교하면 뜻이 같은 1~2행도 바뀐 줄로 나옵니다. -i로 대소문자를 무시하면 Listen 줄이 빠지고 첫 파일 2행만 남습니다.
diff -i case-a.txt case-b.txt2c2,3
< ServerName example.com
---
> ServerName example.com
>-w를 더하면 줄 안의 공백을 모두 무시해 ServerName 줄도 같은 줄이 되고, 3행에 더한 빈 줄 하나만 남습니다. -w 대신 공백 개수만 무시하는 -b를 넣어도 이 파일에서는 같은 결과가 나왔습니다.
diff -i -w case-a.txt case-b.txt2a3
>-B까지 붙이면 빈 줄 차이도 무시하므로, 출력 없이 종료 코드 0으로 끝났습니다.
diff -i -w -B case-a.txt case-b.txtecho $?0두 파일을 왼쪽과 오른쪽에 나란히 놓고 볼 때는 -y를 사용합니다. 기본 폭은 130칸이라 -W 70으로 줄였습니다.
diff -y -W 70 config-old.conf config-new.conf# app config # app config
listen 80 | listen 443
server_name example.com | server_name example.com www.ex
root /var/www/html root /var/www/html
gzip off <
log_level warn log_level warn
> cache on가운데 세로선(|)은 바뀐 줄, <는 첫 파일에만 있는 줄, >는 둘째 파일에만 있는 줄입니다. 폭을 좁히면 긴 줄이 잘립니다. server_name 줄은 오른쪽에서 www.ex까지만 나왔습니다.
--suppress-common-lines를 더하면 같은 줄은 빼고 다른 줄만 남깁니다.
diff -y --suppress-common-lines -W 70 config-old.conf config-new.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache on차이의 내용이 아니라 같은지 다른지만 확인할 때는 -q를 사용합니다. 파일이 같을 때 -q는 아무것도 출력하지 않으므로, 같다는 한 줄을 받으려면 -s를 사용합니다.
diff -q config-old.conf config-new.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identical옵션은 아래 두 탭에 모았습니다.
| 옵션 | 복사 | 설명 |
|---|---|---|
| -u, --unified | 바뀐 줄 앞뒤 세 줄까지 함께 묶는 통합 형식으로 출력 | |
| -c, --context | 첫 파일 덩어리와 둘째 파일 덩어리를 따로 출력하는 문맥 형식 | |
| -i, --ignore-case | 대소문자 차이를 무시 | |
| -w, --ignore-all-space | 줄 안의 공백을 모두 무시 | |
| -b, --ignore-space-change | 공백 개수 차이만 무시 | |
| -B, --ignore-blank-lines | 빈 줄 차이를 무시 | |
| -y, --side-by-side | 두 파일을 왼쪽과 오른쪽에 나란히 출력 | |
| -W, --widthNUM | 나란히 출력할 때의 폭을 지정. 기본값은 130칸 | |
| --suppress-common-lines | 나란히 출력할 때 같은 줄은 빼고 다른 줄만 출력 | |
| -q, --brief | 같은지 다른지만 출력. 같으면 아무것도 출력하지 않음 | |
| -s, --report-identical-files | 두 파일이 같을 때 같다는 한 줄을 출력 | |
| -r, --recursive | 하위 폴더 안의 파일까지 비교 |
| 옵션 | 복사 | 설명 |
|---|---|---|
| -U, --unifiedNUM | 통합 형식에서 함께 출력할 앞뒤 줄 수를 지정. 기본값은 3 | |
| -N, --new-file | 한쪽에 없는 파일을 빈 파일로 취급 | |
| -x, --excludePAT | 이름이 패턴과 맞는 파일을 비교에서 제외 | |
| -I, --ignore-matching-linesRE | 바뀐 줄이 모두 정규식과 맞으면 그 차이를 무시 | |
| -Z, --ignore-trailing-space | 줄 끝의 공백을 무시 | |
| -E, --ignore-tab-expansion | 탭을 공백으로 바꿔서 생긴 차이를 무시 | |
| -a, --text | 모든 파일을 텍스트로 취급 | |
| --strip-trailing-cr | 줄 끝의 캐리지 리턴을 떼고 비교 | |
| --colorWHEN | 출력에 색을 넣음. WHEN은 never, always, auto | |
| -v, --version | 버전 정보를 출력 |
🔲 diff 명령어 시뮬레이터
아래 시뮬레이터에서 본문의 예시 파일로 diff를 직접 입력할 수 있습니다. -u로 패치 파일을 저장하거나 -i -w -B, -rq로 비교할 수 있고, config-new.conf에 줄을 하나 더한 뒤 다시 비교하면 바뀐 결과가 나옵니다.
4️⃣ diff -r 폴더 비교
사이트 파일을 배포하기 전후처럼 파일 여러 개를 한꺼번에 비교할 때는 파일 대신 폴더 이름을 적습니다. 예시 폴더 site-v1과 site-v2에는 index.html과 css 폴더가 함께 있고, about.html과 contact.html은 한쪽에만 있습니다.
diff site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>옵션 없이 폴더를 비교하면 한쪽에만 있는 파일은 [Only in] 줄로, 하위 폴더는 [Common subdirectories] 줄로만 나오고 하위 폴더 안의 파일은 비교하지 않습니다. 두 폴더에 같은 이름으로 있는 index.html은 [diff site-v1/index.html site-v2/index.html] 줄 아래에 차이를 출력합니다. -r을 붙이면 css 폴더 안의 style.css에서 바뀐 색상 값까지 출력합니다.
diff -r site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>파일이 많은 폴더는 -rq로 바뀐 파일 목록부터 확인하고, 필요한 파일만 diff로 다시 비교합니다.
diff -rq site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.