Linux 파일 비교

LinuxBeginner
지금 연습하기

소개

Linux 파일 비교 랩에 오신 것을 환영합니다. 현대 소프트웨어 개발 환경에서 파일 비교는 변경 사항 추적, 문제 디버깅, 코드 무결성 유지를 위한 필수적인 기술입니다. 시스템 관리자 또는 개발자로서, 구성 파일, 코드 버전 또는 데이터 파일 간의 차이점을 자주 식별해야 합니다.

이 랩에서는 파일을 줄 단위로 비교하는 강력한 Linux 유틸리티인 diff 명령어를 사용하는 방법을 배우게 됩니다. diff 도구는 파일 버전 간에 정확히 무엇이 변경되었는지 식별하는 데 도움이 되며, 이는 구성을 업데이트하거나, 코드 변경 사항을 검토하거나, 문제를 해결할 때 매우 중요합니다.

파일 비교 기술을 마스터함으로써 파일 버전을 효율적으로 관리하고, 패치를 생성하며, 개발 환경 전반에서 일관성을 보장할 수 있습니다. 이 기본적인 기술은 코드, 구성 파일 또는 시간이 지남에 따라 변경되는 텍스트 기반 데이터를 사용하는 모든 사람에게 유용합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

diff 명령어 이해

diff 명령어는 파일을 줄 단위로 비교하는 데 사용되는 기본적인 Linux 유틸리티입니다. 이 단계에서는 diff 명령어의 기본 구문과 두 개의 간단한 텍스트 파일을 비교하는 방법을 배우게 됩니다.

먼저 diff 유틸리티가 시스템에 설치되어 있는지 확인해 보겠습니다. /home/labex/project 디렉토리에서 터미널을 열고 다음을 실행합니다.

which diff

다음과 유사한 출력을 볼 수 있습니다.

/usr/bin/diff

이는 diff 명령어를 사용할 수 있음을 확인합니다. 어떤 이유로든 설치되지 않은 경우 다음 명령어로 설치할 수 있습니다.

sudo apt-get update && sudo apt-get install -y diffutils

이제 비교할 두 개의 간단한 텍스트 파일을 만들어 보겠습니다. 구성 설정을 나타낼 수 있는 파일을 만들 것입니다.

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config1.txt
echo "motor_speed = 100" >> /home/labex/project/files/config1.txt
echo "acceleration = 20" >> /home/labex/project/files/config1.txt
echo "max_rotation = 180" >> /home/labex/project/files/config1.txt

이제 약간의 차이가 있는 두 번째 파일을 만듭니다.

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config2.txt
echo "motor_speed = 120" >> /home/labex/project/files/config2.txt
echo "acceleration = 20" >> /home/labex/project/files/config2.txt
echo "max_rotation = 180" >> /home/labex/project/files/config2.txt

두 파일의 내용을 이해하기 위해 모두 살펴보겠습니다.

cat /home/labex/project/files/config1.txt

다음이 표시됩니다.

## Configuration File for Robot Arm
motor_speed = 100
acceleration = 20
max_rotation = 180

이제 두 번째 파일을 봅니다.

cat /home/labex/project/files/config2.txt

다음이 표시됩니다.

## Configuration File for Robot Arm
motor_speed = 120
acceleration = 20
max_rotation = 180

이제 diff 명령어를 사용하여 이 두 파일을 비교해 보겠습니다.

diff /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

다음과 유사한 출력을 볼 수 있습니다.

2c2
< motor_speed = 100
---
> motor_speed = 120

이 출력은 다음을 알려줍니다.

  • 첫 번째 파일의 2 행을 두 번째 파일의 2 행과 일치하도록 변경해야 합니다.
  • <는 첫 번째 파일의 행을 나타냅니다.
  • >는 두 번째 파일의 행을 나타냅니다.
  • ---가 있는 행은 두 버전을 구분합니다.

파일 간의 차이점은 motor_speed 값이 100에서 120으로 변경되었다는 것입니다.

고급 diff 옵션 사용

이전 단계에서는 두 파일을 비교하기 위해 기본적인 diff 명령어를 사용했습니다. 이제 다양한 시나리오에서 출력을 더 읽기 쉽고 유용하게 만드는 몇 가지 고급 옵션을 살펴보겠습니다.

통합 형식 (-u 옵션)

통합 형식은 차이점을 더 컨텍스트 인식 방식으로 표시하며 소프트웨어 개발에서 널리 사용됩니다. -u 옵션은 차이점 주변의 여러 줄의 컨텍스트를 표시합니다.

-u 옵션을 사용하여 파일을 비교해 보겠습니다.

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

다음과 유사한 출력을 볼 수 있습니다.

--- /home/labex/project/files/config1.txt 2023-01-01 00:00:00.000000000 +0000
+++ /home/labex/project/files/config2.txt 2023-01-01 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 ## Configuration File for Robot Arm
-motor_speed = 100
+motor_speed = 120
 acceleration = 20
 max_rotation = 180

이 형식에서:

  • - (마이너스) 로 시작하는 줄은 첫 번째 파일에 있지만 두 번째 파일에는 없습니다.
  • + (플러스) 로 시작하는 줄은 두 번째 파일에 있지만 첫 번째 파일에는 없습니다.
  • 헤더는 어떤 파일이 비교되고 있는지 보여줍니다.
  • @@ -1,4 +1,4 @@ 섹션은 표시되는 줄 번호를 나타냅니다.

나란히 형식 (-y 옵션)

나란히 형식은 두 파일을 병렬 열로 표시하여 차이점을 시각화하기 쉽게 만듭니다.

diff -y /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

출력은 다음과 같아야 합니다.

## Configuration File for Robot Arm  ## Configuration File for Robot Arm
motor_speed = 100    | motor_speed = 120
acceleration = 20    acceleration = 20
max_rotation = 180    max_rotation = 180

이 보기에서:

  • 중간의 | 문자는 줄이 다르다는 것을 나타냅니다.
  • 동일한 줄은 마커 없이 두 열 모두에 나타납니다.

공백 무시 (-w 옵션)

때로는 공백 차이를 고려하지 않고 내용만 비교하려는 경우가 있습니다. -w 옵션은 모든 공백 변경 사항을 무시합니다.

다른 간격으로 파일을 만들어 보겠습니다.

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config3.txt
echo "motor_speed = 100  " >> /home/labex/project/files/config3.txt
echo "acceleration   = 20" >> /home/labex/project/files/config3.txt
echo "max_rotation = 180" >> /home/labex/project/files/config3.txt

이제 첫 번째 파일과 비교해 보겠습니다. 먼저 옵션 없이, 그 다음 -w 옵션으로 비교합니다.

diff /home/labex/project/files/config1.txt /home/labex/project/files/config3.txt

공백으로 인해 차이점을 볼 수 있습니다. 이제 시도해 보세요.

diff -w /home/labex/project/files/config1.txt /home/labex/project/files/config3.txt

-w 옵션을 사용하면 유일한 변형이 공백에 있기 때문에 diff는 차이점을 표시하지 않아야 합니다.

이러한 고급 옵션은 diff를 다양한 사용 사례 및 파일 형식에 더 다양하게 만듭니다. 옵션을 결합하여 특정 요구 사항에 맞게 출력을 사용자 정의할 수 있습니다.

패치 파일 생성 및 적용

패치 파일은 텍스트 파일에 대한 변경 사항을 배포하는 방법입니다. 패치 파일에는 두 버전의 파일 간의 차이점이 포함되어 있으며, 이를 적용하여 한 버전을 다른 버전으로 변환할 수 있습니다. 이는 다른 사람과 코드 변경 사항을 공유하거나 여러 시스템에서 구성 파일을 업데이트해야 할 때 특히 유용합니다.

패치 파일 생성하기

config1.txtconfig2.txt 파일 간의 차이점을 캡처하는 패치 파일을 만들어 보겠습니다.

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt > /home/labex/project/files/config.patch

이 명령어는 통합 diff 형식을 사용하여 config.patch라는 패치 파일을 생성합니다. 이 패치 파일의 내용을 살펴보겠습니다.

cat /home/labex/project/files/config.patch

diff -u 명령어를 사용했을 때와 유사한 출력을 볼 수 있습니다.

--- /home/labex/project/files/config1.txt 2023-01-01 00:00:00.000000000 +0000
+++ /home/labex/project/files/config2.txt 2023-01-01 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 ## Configuration File for Robot Arm
-motor_speed = 100
+motor_speed = 120
 acceleration = 20
 max_rotation = 180

패치 파일 적용하기

이제 config1.txt의 복사본을 만들고 패치를 적용하여 업데이트해 보겠습니다.

cp /home/labex/project/files/config1.txt /home/labex/project/files/config1_copy.txt

패치를 적용하려면 patch 명령어를 사용합니다.

patch /home/labex/project/files/config1_copy.txt < /home/labex/project/files/config.patch

패치가 성공적으로 적용되었음을 나타내는 출력을 볼 수 있습니다.

patching file /home/labex/project/files/config1_copy.txt

패치된 파일이 이제 config2.txt와 일치하는지 확인해 보겠습니다.

cat /home/labex/project/files/config1_copy.txt

출력은 config2.txt와 동일해야 합니다.

## Configuration File for Robot Arm
motor_speed = 120
acceleration = 20
max_rotation = 180

패치된 파일과 config2.txt 간에 차이점이 없는지 확인해 보겠습니다.

diff /home/labex/project/files/config1_copy.txt /home/labex/project/files/config2.txt

출력이 없으면 파일이 동일하다는 의미이며, 패치가 올바르게 적용되었음을 확인합니다.

더 복잡한 패치 파일 생성하기

새 파일에서 여러 줄을 수정하여 더 복잡한 패치를 만들어 보겠습니다.

cp /home/labex/project/files/config1.txt /home/labex/project/files/config4.txt

이제 파일을 편집하여 몇 가지 변경 사항을 적용합니다.

echo "## Updated Configuration File for Robot Arm" > /home/labex/project/files/config4.txt
echo "motor_speed = 150" >> /home/labex/project/files/config4.txt
echo "acceleration = 25" >> /home/labex/project/files/config4.txt
echo "max_rotation = 270" >> /home/labex/project/files/config4.txt
echo "safety_limit = enabled" >> /home/labex/project/files/config4.txt

이제 이러한 변경 사항에 대한 패치 파일을 만듭니다.

diff -u /home/labex/project/files/config1.txt /home/labex/project/files/config4.txt > /home/labex/project/files/complex.patch

이 더 복잡한 패치를 살펴보겠습니다.

cat /home/labex/project/files/complex.patch

추가, 수정 및 삭제를 포함하여 여러 줄 변경 사항을 보여주는 패치 파일을 볼 수 있습니다.

패치는 변경 사항을 배포하고 파일에 대한 수정을 추적하는 효율적인 방법입니다. 이는 코드 변경 사항 공유, 업데이트 생성 및 구성을 관리하기 위해 소프트웨어 개발에서 널리 사용됩니다.

디렉토리 비교 및 기타 비교 도구 사용

개별 파일 비교 외에도 Linux 는 전체 디렉토리를 비교하는 도구를 제공하며 특정 시나리오에 더 적합할 수 있는 대체 비교 도구를 제공합니다.

diff 로 디렉토리 비교하기

diff 명령어는 -r (재귀적, recursive) 옵션을 사용하여 디렉토리를 비교할 수도 있습니다.

비교할 파일이 있는 두 개의 디렉토리를 만들어 보겠습니다.

mkdir -p /home/labex/project/dir1
mkdir -p /home/labex/project/dir2

## 첫 번째 디렉토리에 파일 생성
echo "This is file 1" > /home/labex/project/dir1/file1.txt
echo "This is file 2" > /home/labex/project/dir1/file2.txt
echo "This is file 3" > /home/labex/project/dir1/file3.txt

## 몇 가지 차이점이 있는 두 번째 디렉토리에 유사한 파일 생성
echo "This is file 1 - modified" > /home/labex/project/dir2/file1.txt
echo "This is file 2" > /home/labex/project/dir2/file2.txt
## 참고: file3.txt는 dir2에 없음
echo "This is a new file" > /home/labex/project/dir2/file4.txt

이제 이러한 디렉토리를 비교해 보겠습니다.

diff -r /home/labex/project/dir1 /home/labex/project/dir2

다음과 유사한 출력을 볼 수 있습니다.

diff -r /home/labex/project/dir1/file1.txt /home/labex/project/dir2/file1.txt
1c1
< This is file 1
---
> This is file 1 - modified
Only in /home/labex/project/dir1: file3.txt
Only in /home/labex/project/dir2: file4.txt

이 출력은 다음을 보여줍니다.

  • file1.txt의 내용 차이
  • file3.txtdir1에만 존재합니다.
  • file4.txtdir2에만 존재합니다.
  • file2.txt는 두 디렉토리 모두에서 동일합니다 (따라서 차이점이 보고되지 않음).

diff3 명령어 사용하기

세 개의 파일 (예: 여러 소스의 변경 사항을 병합할 때) 을 비교해야 하는 경우 diff3 명령어를 사용할 수 있습니다.

자체 변경 사항이 있는 세 번째 구성 파일을 만들어 보겠습니다.

echo "## Configuration File for Robot Arm" > /home/labex/project/files/config5.txt
echo "motor_speed = 100" >> /home/labex/project/files/config5.txt
echo "acceleration = 30" >> /home/labex/project/files/config5.txt
echo "max_rotation = 180" >> /home/labex/project/files/config5.txt

이제 diff3를 사용하여 세 파일을 모두 비교합니다.

diff3 /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt /home/labex/project/files/config5.txt

diff3의 출력 형식은 약간 더 복잡하지만 각 파일이 다른 파일과 어떻게 다른지 보여주므로 병합 충돌을 해결하는 데 유용합니다.

colordiff 명령어 사용하기

colordiff 유틸리티는 diff의 래퍼로, 동일한 출력을 생성하지만 구문 강조 표시가 색상으로 표시되어 읽기 쉽습니다.

먼저 colordiff를 설치해 보겠습니다.

sudo apt-get update && sudo apt-get install -y colordiff

이제 colordiff를 사용하여 파일을 비교합니다.

colordiff /home/labex/project/files/config1.txt /home/labex/project/files/config2.txt

출력은 일반 diff 명령어와 유사하지만 추가, 제거 및 변경된 줄에 대한 색상 강조 표시가 있습니다.

wdiff 명령어 사용하기

wdiff (단어 diff) 명령어는 줄 단위가 아닌 단어 단위로 파일을 비교하므로 산문이나 문서에 더 유용할 수 있습니다.

wdiff를 설치해 보겠습니다.

sudo apt-get update && sudo apt-get install -y wdiff

문장 변경 사항이 있는 두 개의 파일을 만들어 보겠습니다.

echo "The robot arm moves quickly and efficiently." > /home/labex/project/files/sentence1.txt
echo "The robot arm moves slowly but efficiently." > /home/labex/project/files/sentence2.txt

이제 wdiff로 비교합니다.

wdiff /home/labex/project/files/sentence1.txt /home/labex/project/files/sentence2.txt

변경된 단어를 강조 표시하는 출력을 볼 수 있습니다.

The robot arm moves [-quickly and-] {+slowly but+} efficiently.

Linux 의 다양한 비교 도구는 다양한 목적과 시나리오에 사용됩니다.

  • 일반 파일 비교를 위한 diff
  • 디렉토리 비교를 위한 diff -r
  • 삼방 비교를 위한 diff3
  • 색상 강조 표시된 출력을 위한 colordiff
  • 단어 단위 비교를 위한 wdiff

특정 요구 사항에 적합한 도구를 선택하면 파일 비교를 더 효과적이고 효율적으로 만들 수 있습니다.

요약

이 Lab 에서는 다재다능한 diff 명령어를 중심으로 Linux 에서 파일 비교 도구를 효과적으로 사용하는 방법을 배웠습니다. 다음은 습득한 주요 기술입니다.

  1. 기본 파일 비교: 기본 diff 명령어를 사용하여 텍스트 파일 간의 차이점을 식별하는 방법을 배웠으며, 구성 파일 및 코드의 변경 사항을 빠르게 파악하는 데 도움이 됩니다.

  2. 고급 Diff 옵션: 통합 형식 (-u), 나란히 비교 (-y), 공백 무시 (-w) 와 같은 다양한 옵션을 탐색했으며, 각 옵션은 서로 다른 비교 요구 사항을 충족합니다.

  3. 패치 파일: 변경 사항 배포, 시스템 업데이트 및 소프트웨어 프로젝트 기여에 필수적인 기술인 패치 파일을 생성하고 적용했습니다.

  4. 디렉토리 비교: 재귀 옵션 (-r) 을 사용하여 전체 디렉토리를 비교하여 여러 파일 간의 차이점을 동시에 식별하는 데 도움이 되었습니다.

  5. 대체 비교 도구: 삼방 비교를 위한 diff3, 색상 강조 표시된 출력을 위한 colordiff, 단어 단위 비교를 위한 wdiff와 같은 특수 도구를 소개받았습니다.

이러한 파일 비교 기술은 시스템 관리, 소프트웨어 개발 및 구성 관리에 필수적입니다. 이를 통해 변경 사항을 추적하고, 문제를 디버깅하고, 버전 관리를 유지하고, 시스템 간의 일관성을 보장할 수 있습니다.

이러한 도구를 마스터함으로써 모든 Linux 환경에서 텍스트 파일로 작업할 때 효율성을 향상시킬 수 있는 귀중한 기능을 얻었습니다.