Linux 패치 명령어의 활용법
Linux 환경에서 패치 명령은 한 파일 모음에서 다른 파일 모음으로 변경 사항을 빠르고 안전하게 옮기는 데 유용합니다. 이 글에서는 패치를 사용하는 간단한 방법을 소개합니다.
patch
및 diff
명령의 역할
만약 여러분이 텍스트 파일을 가지고 있고, 다른 사람으로부터 해당 파일의 수정된 버전을 받았다고 가정해 봅시다. 이때, 수정된 파일의 모든 변경 사항을 원본 파일에 신속하게 적용하려면 어떻게 해야 할까요? 바로 이럴 때 patch
와 diff
명령어가 사용됩니다. 이 명령어들은 Linux, macOS 등 Unix 계열 운영체제에서 기본적으로 제공됩니다.
diff
명령어는 두 개의 파일 버전을 비교하여 그 차이점을 찾아냅니다. 이 차이점들은 패치 파일이라는 별도의 파일에 저장될 수 있습니다. 반면, patch
명령어는 패치 파일을 읽고 그 내용을 지침으로 삼아 수정된 파일의 변경 사항을 원본 파일에 적용합니다.
이 과정을 텍스트 파일의 전체 디렉토리에서 한 번에 수행할 수 있다고 상상해 보십시오. 이것이 바로 패치의 강력한 기능입니다. 때로는 수정된 파일이 아닌 패치 파일만 전달되기도 합니다. 여러 파일을 번갈아 보내거나 다운로드하는 것보다 패치 파일 하나를 보내거나 공유하는 것이 더 효율적일 수 있습니다.
그렇다면 실제로 패치 파일을 사용하여 파일을 어떻게 패치할까요? 이 글에서 그 과정을 자세히 안내해 드리겠습니다.
patch
명령어는 소프트웨어 소스 코드 작업을 하는 사람들에게 특히 유용하지만, 텍스트 파일이라면 어떤 종류든 효과적으로 사용할 수 있습니다.
예시 시나리오
여기서 우리는 work
라는 디렉토리 안에 두 개의 하위 디렉토리가 있다고 가정합니다. 하나는 working
이고, 다른 하나는 latest
입니다. working
디렉토리에는 소스 코드 파일 세트가 있고, latest
디렉토리에는 일부 파일이 수정된 최신 버전이 있습니다. 안전을 위해 working
디렉토리는 현재 버전의 텍스트 파일 사본입니다.
파일 버전 간의 차이점 찾기
diff
명령어는 두 파일 간의 차이점을 찾아냅니다. 기본적으로는 수정된 줄을 터미널 창에 출력합니다.
예를 들어, slang.c
라는 파일을 working
디렉토리의 버전과 latest
디렉토리의 버전을 비교해 보겠습니다.
-u
(unified) 옵션은 diff
가 변경된 각 섹션의 전후에 있는 수정되지 않은 텍스트 줄도 함께 표시하도록 지시합니다. 이러한 줄을 컨텍스트 라인이라고 하며, patch
명령어가 원본 파일에서 정확히 어디를 변경해야 하는지 파악하는 데 도움을 줍니다.
diff
에게 비교할 파일의 이름을 알려주어야 합니다. 원본 파일이 먼저, 수정된 파일이 나중에 나열됩니다. 다음은 diff
명령의 예시입니다:
diff -u working/slang.c latest/slang.c
diff
는 파일 간의 차이를 보여주는 목록을 출력합니다. 파일이 동일하면 아무것도 출력되지 않습니다. diff
의 출력을 통해 두 파일 버전 간에 차이가 있으며 원본 파일에 패치가 필요하다는 것을 알 수 있습니다.
패치 파일 생성
이러한 차이점을 패치 파일로 저장하려면, diff
의 출력을 파일로 리디렉션해야 합니다. 다음 명령은 diff
의 출력을 slang.patch
파일로 저장합니다.
diff -u working/slang.c latest/slang.c > slang.patch
성공적으로 패치가 적용되면, 파일이 패치되었다는 메시지가 출력됩니다.
원본 파일 백업 생성
-b
(backup) 옵션을 사용하여 패치 적용 전에 패치할 파일의 백업 복사본을 만들도록 patch
에 지시할 수 있습니다. -i
(input) 옵션은 사용할 패치 파일 이름을 patch
에 알려줍니다.
patch -u -b working/slang.c -i slang.patch
파일은 이전과 같이 패치되지만, working
폴더를 살펴보면 slang.c.orig
파일이 생성된 것을 확인할 수 있습니다. 파일의 날짜와 시간 스탬프를 통해 slang.c.orig
가 원본 파일이고, slang.c
가 패치에 의해 생성된 새로운 파일임을 알 수 있습니다.
디렉토리에 diff
사용
diff
를 사용하여 두 디렉토리의 파일 간의 모든 차이점을 포함하는 패치 파일을 만들 수 있습니다. 그런 다음 이 패치 파일을 patch
와 함께 사용하여 한 번의 명령으로 working
폴더의 파일에 변경 사항을 적용할 수 있습니다.
diff
와 함께 사용할 옵션은 -u
(unified context), diff
가 하위 디렉토리를 보도록 만드는 -r
(recursive), 그리고 -N
(new file) 옵션입니다.
-N
옵션은 diff
에게 working
디렉토리에는 없지만 latest
디렉토리에만 있는 파일을 처리하는 방법을 알려줍니다. 이 옵션은 패치 파일에 명령을 추가하여, latest
디렉토리에 있지만 working
디렉토리에는 없는 파일들을 생성하도록 합니다.
옵션은 다음과 같이 한데 묶어서 사용할 수 있습니다.
여기서는 파일 이름을 지정하지 않고, 디렉토리 이름만 제공합니다.
diff -ruN working/ latest/ > slang.patch
파일 상단에는 slang.c
파일의 두 버전 간의 차이점이 표시됩니다.
패치 파일을 더 아래로 스크롤하면 structs.h
라는 다른 파일의 변경 사항을 설명하는 부분도 볼 수 있습니다. 이는 패치 파일에 여러 파일의 서로 다른 버전 간의 차이점이 포함되어 있음을 보여줍니다.
패치 적용 전 확인
대규모 파일 모음을 패치하는 것은 다소 불안할 수 있으므로 --dry-run
옵션을 사용하여 모든 것이 정상인지 확인한 후 변경 사항을 적용하는 것이 좋습니다.
--dry-run
옵션은 실제로 파일을 수정하는 것을 제외한 모든 작업을 수행하도록 patch
에 지시합니다. patch
는 모든 사전 검사를 수행하고, 문제가 있으면 보고합니다. 어떤 경우든 파일은 수정되지 않습니다.
문제가 보고되지 않으면 --dry-run
옵션 없이 명령을 반복하여 파일을 패치할 수 있습니다.
-d
(directory) 옵션은 patch
에게 작업할 디렉토리를 알려줍니다.
패치 파일은 -i
(input) 옵션 대신 리디렉션 <
를 사용하여 patch
에 전달합니다.
patch --dry-run -ruN -d working < slang.patch
전체 디렉토리에서 diff
는 패치할 파일 2개를 발견했습니다. 해당 파일의 수정 사항에 대한 지침이 patch
에 의해 확인되었으며, 아무런 문제도 보고되지 않았습니다.
사전 검사가 완료되었으므로 이제 패치를 적용할 준비가 되었습니다.
디렉토리 패치
파일에 실제로 패치를 적용하려면, --dry-run
옵션 없이 이전 명령을 사용합니다.
patch -ruN -d working < slang.patch
이번에는 각 출력 줄이 “checking”으로 시작하지 않고, “patching”으로 시작합니다.
또한 아무런 문제도 보고되지 않습니다. 이제 소스 코드를 컴파일하여 최신 버전의 소프트웨어를 사용할 수 있습니다.
차이점 해결
이 방법은 패치를 사용하는 가장 쉽고 안전한 방법입니다. 대상 파일을 폴더에 복사한 후 해당 폴더에 패치를 적용합니다. 패치 과정이 오류 없이 완료되었다고 판단되면, 파일을 다시 복사하여 원래대로 되돌릴 수 있습니다.