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

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정
텍스트 보기 · 편집 명령어diff위치/usr/bin/diff

diff 명령어는 두 파일을 줄 단위로 비교해 서로 다른 줄만 출력하는 리눅스 명령어입니다. 웹 서버 설정을 흉내 낸 이전 파일과 새 파일을 diff로 비교해 바뀐 세 곳을 2,3c2,3, 5d4, 6a6 세 줄로 확인했고, -u 옵션으로 저장한 패치 파일에는 같은 변경이 빼기와 더하기 기호로 정리되었습니다.

아래 출력의 파일 이름과 내용, 작업 폴더 /root/work는 예시 값입니다. 비교한 파일은 모두 시험용으로 만든 작은 파일입니다.

1️⃣ diff 명령어 기본 사용법과 출력 읽기

명령의 기본 꼴은 diff, 옵션, 첫 파일, 둘째 파일 순서입니다. 첫 파일을 둘째 파일과 같게 만들려면 어느 줄을 바꾸고 지우고 더해야 하는지를 줄 번호와 함께 출력합니다.

비교에 사용한 두 파일은 웹 서버 설정을 흉내 낸 여섯 줄짜리 파일입니다.

cd /root/work
cat config-old.conf
# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warn
cat 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.conf
2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache on
echo $?
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.conf
echo $?
0

없는 파일을 주면 오류 문구가 나오고 종료 코드는 2입니다.

diff config-old.conf nosuch.conf
diff: nosuch.conf: No such file or directory
echo $?
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.patch
echo $?
1
cat /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.txt
Listen 80
ServerName example.com
DocumentRoot /var/www/html
cat case-b.txt
listen 80
ServerName  example.com

DocumentRoot /var/www/html
diff case-a.txt case-b.txt
1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName  example.com
>

옵션 없이 비교하면 뜻이 같은 1~2행도 바뀐 줄로 나옵니다. -i로 대소문자를 무시하면 Listen 줄이 빠지고 첫 파일 2행만 남습니다.

diff -i case-a.txt case-b.txt
2c2,3
< ServerName example.com
---
> ServerName  example.com
>

-w를 더하면 줄 안의 공백을 모두 무시해 ServerName 줄도 같은 줄이 되고, 3행에 더한 빈 줄 하나만 남습니다. -w 대신 공백 개수만 무시하는 -b를 넣어도 이 파일에서는 같은 결과가 나왔습니다.

diff -i -w case-a.txt case-b.txt
2a3
>

-B까지 붙이면 빈 줄 차이도 무시하므로, 출력 없이 종료 코드 0으로 끝났습니다.

diff -i -w -B case-a.txt case-b.txt
echo $?
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.conf
listen 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.conf
Files config-old.conf and config-new.conf differ
diff -s config-old.conf config-copy.conf
Files 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에 줄을 하나 더한 뒤 다시 비교하면 바뀐 결과가 나옵니다.

diff 명령어 시뮬레이터diff · root 계정
[root@server work]#
키보드 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다.

4️⃣ diff -r 폴더 비교

사이트 파일을 배포하기 전후처럼 파일 여러 개를 한꺼번에 비교할 때는 파일 대신 폴더 이름을 적습니다. 예시 폴더 site-v1과 site-v2에는 index.html과 css 폴더가 함께 있고, about.html과 contact.html은 한쪽에만 있습니다.

diff site-v1 site-v2
Only 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-v2
Only 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-v2
Only 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 & 추천 콘텐츠

cmp는 두 파일을 바이트 단위로 비교해 처음 다른 위치 하나만 출력합니다. 본문의 두 설정 파일을 cmp로 비교한 결과는 [config-old.conf config-new.conf differ: char 21, line 2] 한 줄이었습니다. 줄 단위 비교가 의미 없는 압축 파일이나 이미지가 같은지 확인할 때 사용합니다.

patch 명령에 원본 파일과 패치 파일을 차례로 넘깁니다([patch config-old.conf config.patch]). patch는 원본 파일을 그 자리에서 바꾸므로, -o로 결과를 다른 파일에 쓰거나 사본에 먼저 적용합니다.

--color[=WHEN] 옵션으로 색을 넣을 수 있고, WHEN 자리에는 never, always, auto를 넣습니다. 값을 생략한 --color는 auto와 같아 터미널에 출력할 때만 색을 넣으므로, less 같은 다른 명령으로 넘길 때도 색을 남기려면 --color=always를 사용합니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 0   +   4   =