2010. 12. 8. 12:43

Linux/Ubuntu에서 diff로 차이점 체크하기

만약 두 version의 file이 있는 경우, 그 두개의 파일간의 차이(difference)를 찾아내는 것이 필요할 때가 있습니다. 예를 들어, software package를 업그레이드 할 때나, config.old나 config.bak과 같이 새로운 file 이름으로 설정을 저장하는 경우가 해당됩니다. 그런 경우, diff 명령으로 어떤 줄이 차이가 나는지 알아 낼 수 있어 그 두개의 file을 통합(merge)할 수 있습니다.

$ cat config
[sec1]
val1=1
val2=2
[sec2]
val1=3
val2=4
$ cat config.old
[sec1]
val1=a
val2=b
val3=c
[sec2]
val1=10
val2=11
$ diff config config.old
2,3c2,4
< val1=1
< val2=2
---
> val1=a
> val2=b
> val3=c
5,6c6,7
< val1=3
< val2=4
---
> val1=10
> val2=11

위와 같은 output을 사람이 쉽게 읽을 수 있는 unified format으로 변경할 수 있습니다. +와 - 기호를 이용하여 file간에 차이를 보여주는데, 관련 줄의 앞, 뒤에 보고하는 줄을 추가하여 보여주도록 합니다.

$ diff -u config config.old
--- config      2010-11-16 20:21:03.469053831 -0800
+++ config.old  2010-11-16 20:22:25.878054480 -0800
@@ -1,6 +1,7 @@
 [sec1]
-val1=1
-val2=2
+val1=a
+val2=b
+val3=c
 [sec2]
-val1=3
-val2=4
+val1=10
+val2=11

diff -u는 수정된 날짜를 각각 개별 출력해 줍니다. 그리고 sdiff는 다른 화면을 보여줍니다. sdiff 명령은 각 파일을 통합하여 출력할 수 있도록 지원합니다.

$ sdiff config config.old
[sec1]                                                          [sec1]
val1=1                                                        | val1=a
val2=2                                                        | val2=b
                                                              > val3=c
[sec2]                                                          [sec2]
val1=3                                                        | val1=10
val2=4                                                        | val2=11

또, 다른 버전의 diff는 vimdiff입니다. 그것은 vim/vim-gnome/vim-tiny/vim-gtk/vim-nox package가 설치되어야 하며, 두 file의 차이점을 color로 표현해 줍니다.

diff -u 명령의 output은 patch 명령에 사용되기도 합니다. patch 명령은 old file과 diff file을 input으로 받아 patch file을 생성합니다. 다음은 두개의 file을 diff하고 patch file을 생성한뒤 첫 file에 patch를 적용하는 과정을 보여줍니다. (patch 명령은 해당 software package를 설치(sudo apt-get install patch)해야 동작합니다.)

$ cat config
[sec1]
val1=1
val2=2
[sec2]
val3=3
val4=4
$ cat config.new
[sec1]
val1=a
val2=2
val2_1=c
[sec2]
val3=3
$ diff -u config config.new
--- config      2010-11-16 20:56:01.351580253 -0800
+++ config.new  2010-11-16 20:56:32.539937203 -0800
@@ -1,6 +1,6 @@
 [sec1]
-val1=1
+val1=a
 val2=2
+val2_1=c
 [sec2]
 val3=3
-val4=4
$ diff -u config config.new > patchfile.txt
$ patch config < patchfile.txt

patching file config
$ cat config
[sec1]
val1=a
val2=2
val2_1=c
[sec2]
val3=3

위와 같이 config file이 config.new file로 부터 통합(merge)되었음을 확인할 수 있습니다.
즉, val1=1, val2=2, val3=3, val4=4에서 val1=a, val2=2, val2_1=c, val3=3으로 변경된것을 확인할 수 있습니다.