Linux 터미널에서 두 개의 텍스트 파일을 비교하는 방법

텍스트 파일의 두 버전 간의 차이점을 확인해야 합니까? 그런 다음 diff가 필요한 명령입니다. 이 튜토리얼은 Linux 및 macOS에서 diff를 사용하는 쉬운 방법을 보여줍니다.

차이에 뛰어들다

diff 명령은 두 파일을 비교하고 둘 사이의 차이점 목록을 생성합니다. 보다 정확하게 하기 위해 첫 번째 파일을 변경하여 두 번째 파일과 일치하도록 해야 하는 변경 목록을 생성합니다. 이것을 염두에 두면 diff의 출력을 더 쉽게 이해할 수 있습니다. diff 명령은 소스 코드 파일 간의 차이점을 찾고 다음과 같은 다른 프로그램에서 읽고 작동할 수 있는 출력을 생성하도록 설계되었습니다. 반점 명령. 이 튜토리얼에서는 diff를 사용하는 가장 유용한 인간 친화적인 방법을 살펴볼 것입니다.

바로 들어가서 두 개의 파일을 분석해 보겠습니다. 명령줄에서 파일의 순서는 diff가 ‘첫 번째 파일’로 간주하는 파일과 “두 번째 파일”로 간주하는 파일을 결정합니다. 아래 예에서 alpha1은 첫 번째 파일이고 alpha2는 두 번째 파일입니다. 두 파일 모두 음성 알파벳 그러나 두 번째 파일인 alpha2는 두 파일이 동일하지 않도록 몇 가지 추가 편집을 했습니다.

이 명령으로 파일을 비교할 수 있습니다. diff, 공백, 첫 번째 파일 이름, 공백, 두 번째 파일 이름을 입력하고 Enter 키를 누릅니다.

diff alpha1 alpha2

그 출력을 어떻게 분석합니까? 무엇을 찾아야 하는지 알면 그렇게 나쁘지 않습니다. 각 차이점은 단일 열에 차례로 나열되고 각 차이점에는 레이블이 지정됩니다. 레이블에는 4c4와 같이 문자의 양쪽에 숫자가 포함되어 있습니다. 첫 번째 숫자는 alpha1의 줄 번호이고 두 번째 숫자는 alpha2의 줄 번호입니다. 중간에 있는 문자는 다음과 같을 수 있습니다.

c: 첫 번째 파일의 행은 두 번째 파일의 행과 일치하도록 변경되어야 합니다.
d: 첫 번째 파일의 행은 두 번째 파일과 일치하도록 삭제되어야 합니다.
a: 두 번째 파일과 일치하도록 첫 번째 파일에 추가 콘텐츠를 추가해야 합니다.

이 예에서 4c4는 alpha1의 네 번째 라인이 alpha2의 네 번째 라인과 일치하도록 변경되어야 함을 알려줍니다. 이것은 diff가 찾은 두 파일 간의 첫 번째 차이점입니다.

로 시작하는 줄은 두 번째 파일인 alpha2를 나타냅니다. Dave 줄은 Dave라는 단어가 alpha2의 네 번째 줄 내용임을 알려줍니다. 요약하자면 alpha1의 4번째 줄에서 Delta를 Dave로 교체하여 두 파일에서 해당 줄이 일치하도록 해야 합니다.

  Open Media Vault로 Linux NAS를 구축하는 방법

다음 변경 사항은 12c12로 표시됩니다. 동일한 논리를 적용하면 alpha1의 12번째 줄에는 Lima라는 단어가 포함되어 있지만 alpha2의 12번째 줄에는 Linux라는 단어가 포함되어 있습니다.

세 번째 변경 사항은 alpha2에서 삭제된 줄을 나타냅니다. 레이블 21d20은 “두 파일을 20행부터 동기화하려면 첫 번째 파일에서 21행을 삭제해야 합니다.”로 해독됩니다. NS

네 번째 차이는 26a26,28로 표시됩니다. 이 변경은 alpha2에 추가된 세 개의 추가 라인을 나타냅니다. 레이블의 26,28에 주목하십시오. 쉼표로 구분된 두 줄 숫자는 줄 번호 범위를 나타냅니다. 이 예에서 범위는 26행부터 28행까지입니다. 레이블은 “첫 번째 파일의 26행에서 두 번째 파일의 26~28행을 추가하십시오.”로 해석됩니다. alpha1에 추가해야 하는 alpha2의 세 줄을 볼 수 있습니다. 여기에는 Quirk, Strange 및 Charm이라는 단어가 포함됩니다.

Snappy 원 라이너

두 파일이 동일한지 여부만 알고 싶다면 -s(동일한 파일 보고) 옵션을 사용하십시오.

diff -s alpha1 alpha3

-q(간단한) 옵션을 사용하여 서로 다른 두 파일에 대해 똑같이 간결한 설명을 얻을 수 있습니다.

diff -q alpha1 alpha2

한 가지 주의해야 할 점은 두 개의 동일한 파일에서 -q(간단한) 옵션이 완전히 조여져 아무 것도 보고하지 않는다는 것입니다.

대안적 관점

-y(병렬) 옵션은 다른 레이아웃을 사용하여 파일 차이점을 설명합니다. 표시되는 열 수를 제한하기 위해 나란히 보기와 함께 -W(너비) 옵션을 사용하는 것이 편리한 경우가 많습니다. 이렇게 하면 출력을 읽기 어렵게 만드는 추악한 줄바꿈이 방지됩니다. 여기에서 우리는 diff에 병렬 디스플레이를 생성하고 출력을 70개 열로 제한하도록 지시했습니다.

diff -y -W 70 alpha1 alpha2

명령줄의 첫 번째 파일인 alpha1은 왼쪽에 표시되고 명령줄의 두 번째 줄인 alpha2는 오른쪽에 표시됩니다. 각 파일의 줄이 나란히 표시됩니다. 변경, 삭제 또는 추가된 alpha2의 행 옆에 표시 문자가 있습니다.

|: 두 번째 파일에서 변경된 라인.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: 첫 번째 파일에 없는 두 번째 파일에 추가된 줄.

파일 차이점에 대한 보다 간결한 병렬 요약을 원하면 –suppress-common-lines 옵션을 사용하십시오. 이렇게 하면 diff가 변경, 추가 또는 삭제된 줄만 나열하도록 합니다.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

스플래시 컬러 추가

colordiff라는 또 다른 유틸리티는 diff 출력에 색상 강조 표시를 추가합니다. 이렇게 하면 어떤 라인에 차이가 있는지 훨씬 쉽게 알 수 있습니다.

  Systemd는 Linux 홈 디렉토리 작동 방식을 변경합니다.

Ubuntu 또는 다른 Debian 기반 배포를 사용하는 경우 apt-get을 사용하여 이 패키지를 시스템에 설치합니다. 다른 Linux 배포판에서는 Linux 배포판의 패키지 관리 도구를 대신 사용하십시오.

sudo apt-get install colordiff

diff를 사용하는 것처럼 colordiff를 사용하십시오.

사실, colordiff는 diff의 래퍼이고 diff는 모든 작업을 배후에서 수행합니다. 그 때문에 모든 diff 옵션은 colordiff와 함께 작동합니다.

일부 컨텍스트 제공

파일의 모든 줄을 화면에 표시하는 것과 변경된 줄만 나열하는 것 사이의 중간 지점을 찾기 위해 diff에 컨텍스트를 제공하도록 요청할 수 있습니다. 두 가지 방법이 있습니다. 두 가지 방법 모두 동일한 목적을 달성하는데, 이는 변경된 각 행 전후에 일부 행을 표시하는 것입니다. 차이가 감지된 위치의 파일에서 무슨 일이 일어나고 있는지 볼 수 있습니다.

첫 번째 방법은 -c(복사된 컨텍스트) 옵션을 사용합니다.

colordiff -c alpha1 alpha2

diff 출력에는 헤더가 있습니다. 헤더에는 두 개의 파일 이름과 수정 시간이 나열됩니다. 별표가 있습니다

첫 번째 파일 이름 앞에 대시(-)가 있고 두 번째 파일 이름 앞에 대시(-)가 있습니다. 별표와 대시는 출력의 줄이 속한 파일을 나타내는 데 사용됩니다.

중간에 1,7이 있는 별표 줄은 alpha1의 줄을 보고 있음을 나타냅니다. 정확히는 1~7행을 보고 있습니다. Delta라는 단어는 변경된 것으로 플래그가 지정됩니다. 옆에 느낌표( ! )가 있고 빨간색입니다. 파일에서 해당 줄의 컨텍스트를 볼 수 있도록 해당 줄 앞뒤에 세 줄의 변경되지 않은 텍스트가 표시됩니다.

중간에 1,7이 있는 대시 라인은 우리가 지금 alpha2의 라인을 보고 있음을 알려줍니다. 다시, 우리는 라인 4에서 Dave라는 단어가 다른 것으로 플래그가 지정된 라인 1에서 7을 보고 있습니다.

colordiff -C 2 alpha1 alpha2

각 변경 사항의 위와 아래에 있는 세 줄의 컨텍스트가 기본값입니다. diff가 제공할 컨텍스트의 줄 수를 지정할 수 있습니다. 이렇게 하려면 대문자 “C”와 함께 -C(복사된 컨텍스트) 옵션을 사용하고 원하는 줄 수를 제공합니다.

colordiff -u alpha1 alpha2

컨텍스트를 제공하는 두 번째 diff 옵션은 -u(통합 컨텍스트) 옵션입니다.

이전과 마찬가지로 출력에 헤더가 있습니다. 두 파일의 이름이 지정되고 수정 시간이 표시됩니다. alpha1 이름 앞에 대시(-)가 있고 alpha2 이름 앞에 더하기 기호(+)가 있습니다. 이것은 대시가 alpha1을 참조하는 데 사용되고 더하기 기호가 alpha2를 참조하는 데 사용된다는 것을 알려줍니다. 목록 전체에 흩어져 있는 줄은 at 기호(@)로 시작합니다. 이 선은 각 차이의 시작을 표시합니다. 또한 각 파일에서 어떤 행이 표시되는지 알려줍니다.

  Linux PC에 DVD 및 Blu-ray를 저장하는 방법

변경된 라인의 컨텍스트를 볼 수 있도록 서로 다른 것으로 플래그가 지정된 라인 전후에 세 개의 라인이 표시됩니다. 통합 보기에서 차이가 있는 선이 다른 선 위에 표시됩니다. alpha1의 줄 앞에 대시가 오고 alpha2의 줄 앞에 더하기 기호가 옵니다. 이 디스플레이는 위에서 복사한 컨텍스트 디스플레이가 수행하는 데 15개 걸렸던 것을 8줄로 달성합니다.

colordiff -U 2 alpha1 alpha2

예상대로 diff에 보고 싶은 통합 컨텍스트의 줄 수를 정확히 제공하도록 요청할 수 있습니다. 이렇게 하려면 대문자 “U”와 함께 -U(통합 컨텍스트) 옵션을 사용하고 원하는 줄 수를 제공합니다.

공백 및 대소문자 무시

colordiff -y -W 70 test4 test5

또 다른 두 개의 파일 test4와 test5를 분석해 보겠습니다. 여기에는 6명의 슈퍼히어로 이름이 들어 있습니다.

결과는 diff가 Black Widow, Spider-Man 및 Thor 라인과 다른 점을 찾지 못한다는 것을 보여줍니다. Captain America, Ironman 및 The Hulk 라인의 변경 사항을 표시합니다.

그래서 무엇이 다른가? 음, test5에서 헐크는 소문자 “h”로 철자를 쓰고 캡틴 아메리카는 “Captain”과 “America” ​​사이에 추가 공백이 있습니다. 알겠습니다. 하지만 Ironman 라인에 문제가 있는 것은 무엇입니까? 눈에 보이는 차이는 없습니다. 여기에 좋은 경험 법칙이 있습니다. 당신이 그것을 볼 수 없다면, 대답은 공백입니다. 그 줄 끝에는 거의 확실히 한두 개의 공백 또는 탭 문자가 있습니다.

그것들이 당신에게 중요하지 않다면 다음을 포함하여 특정 유형의 줄 차이를 무시하도록 diff에 지시할 수 있습니다.
-i: 대소문자의 차이를 무시합니다.
-Z: 후행 공백을 무시합니다.
-b: 공백의 양의 변화를 무시합니다.

-w: 모든 공백 변경 사항을 무시합니다.

colordiff -i -y -W 70 test4 test5

diff에 이 두 파일을 다시 확인하도록 요청해 보겠습니다. 하지만 이번에는 대소문자 차이를 무시합니다.

colordiff -i -Z -y -W 70 test4 test5

“The Hulk” 및 “The hulk”가 있는 줄은 이제 일치하는 것으로 간주되며 소문자 “h”에 대해 차이가 표시되지 않습니다. diff에 후행 공백도 무시하도록 요청합시다.

colordiff -i -w -y -W 70 test4 test5

의심되는 바와 같이, diff는 더 이상 해당 줄에 대한 차이를 표시하지 않기 때문에 후행 공백은 Ironman 줄의 차이였을 것입니다. 캡틴 아메리카를 떠나게 됩니다. 대소문자를 무시하고 모든 공백 문제를 무시하도록 diff를 요청합시다.

우리가 신경 쓰지 않는 차이점을 무시하도록 diff에 지시함으로써 diff는 우리의 목적을 위해 파일이 일치한다고 알려줍니다. diff 명령에는 더 많은 옵션이 있지만 대부분은 기계가 읽을 수 있는 출력을 생성하는 것과 관련이 있습니다. Linux에서 검토할 수 있습니다.매뉴얼 페이지

. 위의 예에서 사용한 옵션을 사용하면 명령줄과 사람의 눈을 사용하여 텍스트 파일 버전 간의 모든 차이점을 추적할 수 있습니다.