웹사이트 검색

diff 명령을 사용하여 Linux에서 파일을 줄 단위로 비교하는 방법 - 파트 II


이 페이지에서

  1. Diff 명령 옵션
    1. 1. 파일이 동일한 경우 보고\n
    2. 2. 복사된 컨텍스트 및 통합 컨텍스트\n
    3. 3. ed 스크립트 출력
    4. 4. 두 개의 열로 출력 생성
    5. 5. 공통 라인 숨기기
    6. 6. 각 변경 사항이 있는 C 함수 표시\n
    7. 7. 재귀적으로 하위 디렉토리 비교\n
    8. 8. 없는 파일을 비어 있는 것으로 취급

    이 diff 명령어 가이드 시리즈의 첫 번째 부분에서는 명령어의 작동 방식과 출력 결과를 이해할 수 있는 방법을 포함하여 명령어의 기본 사항에 대해 논의했습니다. 이 명령줄 유틸리티와 관련하여 약간의 학습 곡선이 있지만 특히 일상 작업에 CLI 전용 Linux 시스템에서 파일 관련 작업을 수행하는 경우 학습할 가치가 있습니다.

    diff 명령의 기본 사용법을 이미 알고 있다고 가정하고 이 자습서에서는 이해하기 쉬운 몇 가지 예를 통해 도구가 제공하는 다양한 명령줄 옵션에 대해 설명합니다.

    하지만 계속 진행하기 전에 이 가이드의 모든 예시는 Ubuntu 14.04에서 Bash 버전 4.3.11(1) 및 diff 버전 3.3으로 테스트되었다는 점에 유의하세요.

    <엠>

    비교 명령 옵션

    1. 파일이 동일할 때 보고

    기본적으로 diff 명령이 비교 중인 파일이 동일함을 감지하면 출력을 생성하지 않습니다.

    $ diff file1 file2
    $

    그러나 명령이 출력에서 이를 보고하도록 강제할 수 있는 명령줄 옵션(-s)이 있습니다.

    $ diff -s file1 file2
    Files file1 and file2 are identical

    2. 복사된 컨텍스트와 통합된 컨텍스트

    이들은 기본적으로 diff 명령이 출력을 생성할 수 있는 두 가지 다른 형식입니다. 복사된 컨텍스트는 -c 명령줄 옵션을 사용하여 활성화되고 통합 컨텍스트는 -u를 사용하여 활성화됩니다. 다음은 전자의 예입니다.

    $ diff -c file1 file2
    *** file1 2016-12-29 09:36:47.175597647 +0530
    --- file2 2016-12-29 09:19:55.799558326 +0530
    ***************
    *** 1,3 ****
    Hi
    ! Helllo
    Bye
    --- 1,3 ----
    Hi
    ! Hello
    Bye

    따라서 복사된 컨텍스트 출력 형식에서 서로 다른 행은 느낌표(!)로 표시됩니다.

    다음은 통합 컨텍스트 형식의 예입니다.

    $ diff -u file1 file2
    --- file1 2016-12-29 09:36:47.175597647 +0530
    +++ file2 2016-12-29 09:19:55.799558326 +0530
    @@ -1,3 +1,3 @@
    Hi
    -Helllo
    +Hello
    Bye

    이 출력 형식에서 줄 앞의 +- 기호는 다른 줄의 버전을 나타냅니다. - 파일1의 줄이 파일에서 누락된 경우<2, + 파일2의 줄이 파일1.에 추가된 경우

    3. ed 스크립트 출력

    diff 명령은 또한 ed 편집기가 원본 파일(여기 예제에서는 file1)을 새 파일(file2)로 변환하는 데 사용할 수 있는 명령을 생성할 수 있습니다. 방법은 다음과 같습니다.

    file1 및 file2에 다음 변경 사항이 포함되어 있다고 가정합니다.

    $ diff file1 file2
    2c2
    < Helllo
    ---
    > Hello

    이제 -e 명령줄 옵션을 사용하여 ed 편집기가 이해하는 출력을 생성하고 해당 출력을 파일로 리디렉션합니다.

    diff -e file1 file2 > out

    이 경우 out에 포함된 내용은 다음과 같습니다.

    2c
    Hello
    .

    다음에 해야 할 일은 out 파일 끝에 w 명령을 추가하는 것입니다.

    2c
    Hello
    .
    w

    이제 다음 명령을 실행합니다.

    ed - file1 < out

    이제 file1과 file2가 동일하다는 것을 알 수 있습니다.

    $ diff file1 file2
    $

    이 기능에 대한 자세한 내용은 여기를 참조하십시오.

    4. 두 개의 열로 출력 생성

    일반적으로 diff 명령은 다음과 같은 방식으로 출력을 생성합니다.

    $ diff file1 file2
    2c2
    < Helllo
    ---
    > Hello

    그러나 두 개의 개별 열에 출력을 생성하도록 diff에 지시하는 명령줄 옵션(-y)이 있습니다. 예를 들면 다음과 같습니다.

    $ diff -y file1 file2
    Hi                               Hi
    Helllo                         | Hello
    Bye                              Bye

    보시다시피 이 출력 형식은 | 다른 줄을 나타냅니다.

    5. 공통 라인 숨기기

    이전 섹션(위의 4번 항목)에 표시된 출력을 관찰하면 -y 명령줄 옵션을 사용하면 출력에서 diff가 공통 라인도 생성한다는 것을 알 수 있습니다. 이러한 동일한 줄을 표시하지 않으려면 --suppress-common-lines 옵션을 사용할 수 있습니다.

    :~$ diff -y --suppress-common-lines file1 file2
    Helllo                                   | Hello

    6. 각 변경 사항이 있는 C 함수 표시

    diff를 사용하여 두 C 언어 파일을 비교하는 경우 각 변경 사항이 있는 C 함수를 정확하게 표시하도록 유틸리티에 지시하는 명령줄 옵션(-p)이 있습니다. 예를 들어 다음 두 C 파일이 있다고 가정합니다.

    file1.c:

    #include<stdio.h>

    void compare(float x, float y)
    {
    if(x == y) // incorrect way
    {
    printf("\n EQUAL \n");
    }
    }


    int main(void)
    {
    compare(1.234, 1.56789);

    return 0;
    }

    file2.c:

    #include<stdio.h>

    void compare(float x, float y)
    {
    if(x == y)
    {
    printf("\n EQUAL \n");
    }
    }


    int main(void)
    {
    compare(1.234, 1.56789);

    return 0;
    }

    두 파일을 정상적으로 비교할 때의 출력은 다음과 같습니다.

    $ diff file1.c file2.c 
    5c5
    < if(x == y) // incorrect way
    ---
    > if(x == y)

    다음은 -p 옵션을 사용하여 파일을 비교할 때의 출력입니다.

    $ diff -p file1.c file2.c 
    *** file1.c 2016-12-29 11:45:36.587010816 +0530
    --- file2.c 2016-12-29 11:46:39.823013274 +0530
    ***************
    *** 2,8 ****

    void compare(float x, float y)
    {
    ! if(x == y) // incorrect way
    {
    printf("\n EQUAL \n");
    }
    --- 2,8 ----

    void compare(float x, float y)
    {
    ! if(x == y)
    {
    printf("\n EQUAL \n");
    }

    보시다시피 -p를 사용하면 diff는 느낌표(!)를 사용하여 다른 줄을 표시하여 변경 사항이 있는 위치를 보다 자세히 보여줍니다.

    7. 하위 디렉토리를 재귀적으로 비교

    diff 명령어를 사용하면 하위 디렉터리를 재귀적으로 비교할 수도 있지만 기본 동작은 아닙니다. 내가 말하고자 하는 바는 다음과 같은 경우를 들 수 있다는 것입니다.

    $ diff diff-files/ second-diff-files/
    diff diff-files/file1 second-diff-files/file1
    1c1
    < Hi
    ---
    > i
    diff diff-files/file2 second-diff-files/file2
    2c2
    < Hello
    ---
    > ello

    diff 명령은 최상위 디렉터리에 있는 파일만 비교했지만 명령줄 옵션 -r(재귀 diff용)을 사용하면 하위 디렉터리에 있는 파일도 비교되는 것을 볼 수 있습니다.

    $ diff -r diff-files/ second-diff-files/
    diff -r diff-files/file1 second-diff-files/file1
    1c1
    < Hi
    ---
    > i
    diff -r diff-files/file2 second-diff-files/file2
    2c2
    < Hello
    ---
    > ello
    diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
    1c1
    < Hi
    ---
    > i
    diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
    2c2
    < Hello
    ---
    > ello

    8. 없는 파일을 비어 있는 것으로 취급

    diff 명령은 없는 파일을 비어 있는 것으로 처리하도록 도구에 지시할 수 있는 옵션도 제공합니다. 예를 들어 file1을 file3(존재하지 않음)과 비교하면 diff의 기본 동작은 오류를 생성하는 것입니다.

    $ diff file1 file3
    diff: file3: No such file or directory

    이것은 그 자체로는 잘못된 것이 아닙니다. 사실 이것은 완벽하게 이해됩니다. 그러나 diff 명령이 그러한 상황에서 오류를 발생시키는 것을 원하지 않는 경우가 있을 수 있습니다(bash 스크립트의 일부일 수도 있습니다). 그런 다음 이러한 시나리오의 경우 -N 명령줄 옵션을 사용하여 없는 파일을 비어 있는 것으로 처리하고 비교를 계속하는 명령입니다.

    $ diff -N file1 file3
    1,5d0
    < Hi
    <
    < Helllo
    <
    < Bye

    결론

    이 튜토리얼 시리즈의 두 부분을 모두 제대로 살펴보고 문서에 포함된 모든 예를 연습하면 도구에 대한 훌륭한 명령을 얻게 될 것이라고 해도 과언이 아닐 것입니다. 물론 이 시리즈에서 diff와 관련된 모든 것을 논의할 수는 없지만 많은 중요한 특징/기능이 다루어졌으니 안심하세요.

    유틸리티에 대해 더 알고 싶은 사용자를 위해 매뉴얼 페이지가 항상 준비되어 있습니다. 또한 다양한 사용 사례를 시뮬레이트하기 위해 다양한 파일 세트와 함께 도구를 계속 자주 사용해야 한다는 점은 말할 것도 없습니다.