안녕하세요~

 

정말 더운 저녁 입니다 ㅠㅠ

 

최근에 "diff" 명령을 접하게 되었는데요.

 

정말 유용한 유틸이더라구요!

 

오늘은 diff 사용 후기를 여러분들과 공유 하고 싶어 글을 쓰게 되었습니다~^^

 

두 파일간의 차이점을 보여주는 아주 유용한 유틸리티!!

 

본격 적으로 diff 명령어에 대하여 정리해 보도록 하겠습니다.

 

diff 의 일반적인 사용법은 아래와 같습니다.

 

diff [options] from-file to-file

 

from-file은 원래 파일, 즉 구버전의 파일을 의미하며, to-file은 새로 바뀐 새버전의  파일을 의미합니다.

 

diff 명령어도 옵션을 사용하여 내가 원하는 출력 값을 볼수 있습니다.

 

옵션은 아주~ 많지만 자주 사용하는 옵션만 골라서 정리 해보았습니다!

 

-r   : recursive 옵션으로 서브 디렉토리까지 diff가 모두 탐색

-N : 새로 만들어진 파일까지 포함해서 출력

-u  : 변경되는 부분과 변경되는 부분의 근처의 내용도 출력

 

이 옵션을 사용하여 실습을 한번 해보겠습니다.

 

실습 환경은 우분투 10.04.2 LTS 버전입니다.

 

먼서 간단한 c 파일을 만들고 diff 에 옵션을 주어 어떻게 사용 해야 되는지 정리 해 보겠습니다.

 

소스는 같은 디렉토리 위치에 넣고 실습해 보았습니다.

 

/project/001_diff/

 

001_hello.c

002_hello.c

#include <stdio.h>

 

int main ( void )
{
       printf("I am Hyunki\n");

       return 0;
}

#include <stdio.h>

 

int main ( void )
{
      int i;
 
      for( i = 0; i < 2; i++ )
      printf("I am Hyunki\n");

      return 0;
}

 

위와 같은 코드를 만들고 각각 옵션을 주어 어떤 실행 결과가 나오는지 확인해 보겠습니다.

 

다음과 같은 명령으로 diff 를 실행 시켰을때는 아래와 같은 결과가 나왔습니다.

 

diff 001_hello.c 002_hello.c > hello.txt

 

hello.txt 파일을 만들고 아래의 명령으로 txt 파일을 열어 줍니다.

 

gedit hello.txt

 

명령을 제대로 입력 했으면 아래와 같은 문자열을 보실수 있습니다.

 

이 문자열을 보고 분석해 보겠습니다.

 

hello.txt

5c5,8
< printf("I am Hyunki\n");
---
> int i;
>
> for( i = 0; i < 2; i++ )
> printf("I am Hyunki\n");

 

 

 

 

 

 

 

 

 

 

 

문자열을 보면 5c5, 8 과 "<" ">" 이러한 문자가 적혀 있습니다.

 

각각 뜻을 해석해 보면 "<"는 원래 파일 ( 001_hello.c) 이고 ">"는 바뀐 파일(002_hello.c)이라는 뜻입니다.

 

5c5, 8은 원래 파일( 001_hello.c) 에서 5 라인이 printf("I am Hyunki\n"); 였는데,

 

바뀐 파일( 002_hello.c)에서는 5~8 번째 라인에 int i; for( i = 0; i < 2; i++ ) printf("I am Hyunki\n");이 내용이 추가 되었다는 것입니다.

 

diff 명령은 오리지널 다시 말해서 옵션을 사용하지 않은 형태로는 잘 사용하지 않습니다.

 

옵션을 하나씩 추가 해서 어떤 변화가 생기는지 천천히 배워보도록 하겠습니다.

 

먼서 u 옵션 부터 줘 보겠습니다.

 

diff -u 001_hello.c 002_hello.c > hello.txt

 

아래와 같이 문자들이 바뀐것을 확인 할 수 있습니다.

 

hello.txt

--- 001_hello.c 2011-07-21 00:32:18.247004305 -0700
+++ 002_hello.c 2011-07-21 00:31:14.991017749 -0700
@@ -2,7 +2,10 @@
 
 int main ( void )
 {
-         printf("I am Hyunki\n");
+         int i;

+         for( i = 0; i < 2; i++ )
+          printf("I am Hyunki\n");
 
          return 0;
 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

새로 출력된 문자열들을 해석해 정리해 보도록 하겠습니다.

 

"---"는 원래 파일 "+++"바뀐 파일 입니다.

 

-로 표시된 라인은 제거하고

 

+로 표시된 라인으로 대체 합니다.

 

-u 옵션을 하나 추가 해줬을 뿐인데 엄청 간단하게

 

001_hello.c와 002_hello.c를 비교했던 것은 같은 폴더 였기 때문에 이 실습에서는 옵션의 필요가 없겠죠?

 

이번엔 각각 폴더를 만들어서 다시 실습해 보겠습니다.

 

 그럼 -N 옵션을 사용하여 어떤 문자열을 출력 해주는지 실습해 보겠습니다.

 

전 폴더명을 001_diff, 002_diff 로 하여 2개 만들어 각각 폴더에 복사 하고 하나의 파일을 더 생성해 보겠습니다.

 

이번에는 새로 추가된것이랑 바뀐 것이랑 실습해 보기 위해 002_hello.c를 001_hello.c로 이름을 변경하여 테스트 하겠습니다.

 

001_diff/001_hello.c

002_diff/001_hello.c

002_diff/002_diff.c

#include <stdio.h>

int main ( void )
{
      printf("I am Hyunki\n");

      return 0;
}

#include <stdio.h>

int main ( void )
{
      printf("I am Hyunki\n");

      printf("Hoseo Univ.\n");

      return 0;
}

#include <stdio.h>

int main ( void )
{
      int i;

      for( i = 0; i < 2; i++ )
      printf("I am Hyunki\n");

      return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

디렉토리 끼리의 diff 명령도 파일을 했던 것과 같이 해주면 이상 없이 실행이 된다.

 

아래와 같은 명령으로 diff 명령을 내려 보자.

 

diff -ruN 001_diff 002_diff > diff.txt

 

명령을 잘 입력해 주었다면 아래와 같은 결과를 얻을 수 있습니다. 

 

diff -ruN 001_diff/001_hello.c 002_diff/001_hello.c
--- 001_diff/001_hello.c 2011-07-21 00:32:18.247004305 -0700
+++ 002_diff/001_hello.c 2011-07-21 04:52:26.408595037 -0700
@@ -3,6 +3,7 @@
 int main ( void )
 {
        printf("I am Hyunki\n");
+      printf("Hoseo Univ.\n");
 
        return 0;
 }
diff -ruN 001_diff/002_diff.c 002_diff/002_diff.c
--- 001_diff/002_diff.c 1969-12-31 16:00:00.000000000 -0800
+++ 002_diff/002_diff.c 2011-07-21 04:45:04.538167318 -0700
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+int main ( void )
+{
+      int i;

+      for( i = 0; i < 2; i++ )
+      printf("I am Hyunki\n");
+
+      return 0;
+}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

001_diff/001_hello.c 에서 지워진 내용은 없고 002_diff/001_hello.c에 printk("Hoseo Univ.\n");만 추가 되었다고 출력 해주었다.

 

001_diff/002_hello.c 는 추가 삭제가 없고, 002_diff/002_hello.c 가 완전히 하나 생겼음을 알 수 있습니다.

 

다들 사용 하실수 있으시겠죠??

 

어떻게 쓰느냐에 따라 유용하게 쓸수 있는 명령어 라고 생각합니다!

 

모두 한번씩 실습해보세요~

 

그럼 이만 줄이겠습니다.

 

여러분 모두 행복하세요~~^^*