Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Linux diff 명령어 완벽 가이드 – 파일 차이점 비교부터 패치 생성까지

diff 명령어는 리눅스 셸에서 파일이나 디렉터리를 손쉽게 비교할 수 있는 도구입니다. 이 글에서는 diff의 기본 사용법을 예제와 함께 자세히 살펴보겠습니다.

diff 명령어는 두 개의 파일 또는 디렉터리를 한 줄씩 비교하여 그 차이점을 출력합니다.

파일이나 디렉터리를 비교해야 하는 이유

  • 이름이 같고 내용이 비슷해 보이는 두 파일의 실제 차이점을 확인하고 싶을 때
  • 프로젝트 코드의 이전 버전과 새 버전 사이에 어떤 변경 사항이 있는지 파악하고 싶을 때
  • 다른 드라이브로 복사한 많은 파일들이 손상 없이 제대로 복사되었는지 검증하고 싶을 때
  • 친구와 동일한 폴더 구조를 공유하고 있고, 일부 파일만 수정한 경우 전체를 다시 보내지 않고 변경된 부분만 패치로 만들어 전송하면 상대방은 다운로드 없이 최신 상태로 업데이트할 수 있습니다.

파일을 비교하는 이유는 사람마다 다양하겠지만, 이제 diff의 실제 사용법을 알아보겠습니다.

diff 기본 문법

diff OPTIONS FILES

참고할 점:

  • OPTIONS(옵션)는 선택 사항이며 아래 표의 옵션들을 지정할 수 있습니다.
  • FILES는 비교할 두 파일의 경로이며, 공백으로 구분하여 입력합니다.

diff 주요 옵션

아래는 diff 명령어에서 가장 많이 사용되는 OPTIONS 목록입니다(사용자 매뉴얼 기준):

옵션 설명
-q, --brief 파일이 서로 다를 때만 결과를 보고함
-s, --report-identical-files 두 파일이 동일할 때도 보고함
-u, -U NUM, --unified[=NUM] NUM줄(기본값 3)의 통합 컨텍스트를 출력함
-N, --new-file 없는 파일은 빈 파일로 간주함
-l, --paginate 출력을 'pr'을 통해 페이지 단위로 나눔
-r, --recursive 발견된 하위 디렉터리까지 재귀적으로 비교함
--no-dereference 심볼릭 링크를 따라가지 않음
-a, --text 모든 파일을 텍스트로 취급함
-d, --minimal 더 작은 변경 집합을 찾기 위해 최선을 다함
--speed-large-files 대용량 파일과 흩어진 소규모 변경이 많다고 가정하고 처리함

전체 옵션이 궁금하다면 온라인 매뉴얼을 참고하거나, 명령줄에서 아래 명령어를 실행하세요:

man diff

실전 예제

리눅스에서 두 파일 비교하기

diff 명령어의 가장 기본적인 사용법으로, 지정한 두 파일의 차이점을 콘솔에 출력합니다:

diff file1.txt file2.txt

결과를 파일로 저장하기

패치를 만들 필요 없이 단순히 차이점만 확인하고 싶다면, 출력을 파일로 리디렉션하는 것이 유용합니다. 변경 사항이 많을 경우 터미널 화면에서 잘리는 것을 방지할 수 있습니다:

diff -q file1.txt file2.txt > differences.txt

이 명령은 differences.txt 파일을 생성(또는 덮어쓰기!)하며, 두 파일 간의 차이점 요약이 저장됩니다.

여기서 -q 옵션을 추가하면 차이가 있는 파일만 표시되므로, 동일한 파일은 언급되지 않아 결과를 한눈에 파악하기 쉽습니다.

리눅스에서 디렉터리 비교하기

-r(재귀적) 옵션을 사용하면 디렉터리의 내용까지 비교할 수 있습니다:

diff -r -q /path/to/dir1 /path/to/dir2

마찬가지로 -q 옵션을 함께 사용해 차이가 있는 항목만 표시했습니다.

대용량 파일 또는 대용량 파일이 포함된 디렉터리 비교

diff는 비교 대상인 모든 파일을 읽고 대조해야 하는 집약적인 작업이라 시간이 오래 걸릴 수 있습니다.

--speed-large-files 옵션을 사용하면 diff의 알고리즘이 대용량 파일 비교에 맞게 조정되어 처리 속도가 다소 향상됩니다.

파일용 패치 만들기

패치(patch)란 두 파일 간의 차이점 목록으로, 첫 번째 파일의 다른 사본에 적용하면 두 번째 파일과 동일하게 만들 수 있습니다. 다음 명령어로 패치를 생성할 수 있습니다:

diff -u file1.txt file2.txt > update.patch

-u 옵션은 차이점을 통합(unified) 형식으로 출력하며, 이 형식은 patch 명령어가 원본 파일에 변경 사항을 반영할 때 사용됩니다.

친구나 동료가 여러분의 데이터나 프로그래밍 코드를 사용 중일 때, 전체 데이터셋이나 애플리케이션을 다시 보내지 않고도 업데이트 내역만 전달할 수 있어 매우 유용합니다.

파일에 패치 적용하기

패치를 받은 친구는 다음 patch 명령어로 이를 적용할 수 있습니다:

patch original.txt < update.patch

파일 패치 되돌리기

실수로 잘못 적용했다면 -R 옵션으로 역방향 실행하여 패치를 되돌릴 수 있습니다:

patch -R original.txt < update.patch

디렉터리용 패치 만들기

다음 명령어는 -r(재귀적), -u(통합 형식), -N(없는 파일을 빈 파일로 취급) 옵션을 조합하여 디렉터리 전체의 패치를 생성합니다:

diff -ruN originalDir updatedDir > update.patch

디렉터리에 패치 적용하기

-p0 옵션을 사용하면 패치가 생성 당시와 동일한 디렉터리 구조에 그대로 적용됩니다:

patch -p0 < update.patch

디렉터리 패치 되돌리기

마지막으로, 디렉터리에 적용한 패치를 되돌리거나 역방향으로 실행하는 방법입니다:

patch -R -p0 originalFile < patchFile