Linux에서 파일에 패치를 적용하고 패치를 만드는 방법

0
1522
Linux 데스크탑에서 쉘 프롬프트를 보여주는 PC
Fatmawati Achmad Zaenuri / Shutterstock.com

리눅스 patch 명령을 사용하면 한 파일 세트에서 다른 파일 세트로 변경 사항을 빠르고 안전하게 전송할 수 있습니다. 사용법을 배우십시오 patch 간단한 방법.

patch 및 diff 명령

컴퓨터에 텍스트 파일이 있다고 상상해보십시오. 다른 사람으로부터 해당 텍스트 파일의 수정 된 버전을받습니다. 수정 된 파일의 모든 변경 사항을 원본 파일로 신속하게 전송하는 방법은 무엇입니까? 그 곳에 patchdiff 놀러와 patchdiff Linux 및 macOS와 같은 다른 Unix-Like 운영 체제에서 찾을 수 있습니다.

그만큼 diff 명령은 파일의 두 가지 다른 버전을 검사하고 차이점을 나열합니다. 차이점은 패치 파일이라는 파일에 저장 될 수 있습니다.

그만큼 patch 명령은 패치 파일을 읽고 내용을 일련의 지침으로 사용할 수 있습니다. 이러한 지침에 따라 수정 된 파일의 변경 사항이 원본 파일에 복제됩니다.

이제 프로세스가 전체 텍스트 파일 디렉토리에서 발생한다고 상상해보십시오. 한 번에 모두. 그 힘입니다 patch.

때로는 수정 된 파일이 전송되지 않습니다. 패치 파일 만 보내면됩니다. 하나의 파일을 보내거나 쉽게 다운로드 할 수 있도록 하나의 파일을 게시 할 때 왜 수십 개의 파일을 보내야합니까?

실제로 파일을 패치하기 위해 패치 파일로 무엇을합니까? 거의 혀를 꼬는 것 외에도 좋은 질문입니다. 이 기사에서 살펴 보겠습니다.

그만큼 patch 명령은 소프트웨어 소스 코드 파일을 사용하는 사람들이 가장 자주 사용하지만 목적, 소스 코드에 관계없이 모든 텍스트 파일 세트와 동일하게 작동합니다.

관련 : 리눅스 터미널에서 두 개의 텍스트 파일을 비교하는 방법

예제 시나리오

이 시나리오에서 우리는 두 개의 다른 디렉토리를 포함하는 work라는 디렉토리에 있습니다. 하나는 일, 다른 하나가 호출된다 최근. 작업 디렉토리에는 소스 코드 파일 세트가 있습니다. 최신 디렉토리에는 해당 소스 코드 파일의 최신 버전이 있으며 일부는 수정되었습니다.

작업 디렉토리는 안전을 위해 현재 버전의 텍스트 파일 사본입니다. 그것들의 유일한 사본은 아닙니다.

파일의 두 버전 간 차이점 찾기

그만큼 diff 명령은 두 파일의 차이점을 찾습니다. 기본 조치는 터미널 창에 수정 된 행을 나열하는 것입니다.

하나의 파일이 호출됩니다 slang.c. 작업 디렉토리의 버전과 최신 디렉토리의 버전을 비교합니다.

그만큼 -u (통합) 옵션은 말한다 diff 또한 변경된 각 섹션 전후에 수정되지 않은 텍스트 행을 나열합니다. 이러한 라인을 컨텍스트 라인이라고합니다. 그들은 도와 patch 명령은 원본 파일에서 변경해야 할 위치를 정확하게 찾습니다.

파일 이름을 제공하여 diff 비교할 파일을 알고 있습니다. 원본 파일이 먼저 나열되고 수정 된 파일이 나열됩니다. 이것은 우리가 발행하는 명령입니다 diff:

diff -u working/slang.c latest/slang.c

터미널 창에서 diff -u working / slang.s latest / slang.c

diff 파일 간의 차이점을 보여주는 출력 목록을 생성합니다. 파일이 동일하면 출력이 전혀 표시되지 않습니다. 이 유형의 출력 확인 diff 두 파일 버전간에 차이가 있으며 원본 파일에 패치가 필요함을 확인합니다.

터미널 창에서 diff에서 출력

패치 파일 만들기

패치 파일에서 이러한 차이점을 캡처하려면 다음 명령을 사용하십시오. 위와 동일한 명령이며 출력은 다음과 같습니다. diff slang.patch라는 파일로 리디렉션됩니다.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working / slang.c latest / slang.c> 터미널 창에서 slang.patch

패치 파일의 이름은 임의적입니다. 당신은 그것을 원하는대로 부를 수 있습니다. “.patch”확장자를주는 것이 좋습니다. 그러나 어떤 유형의 파일인지 명확하게 알 수 있습니다.

만들다 patch 패치 파일에 대해 작업하고 working / slang.c 파일을 수정하려면 다음 명령을 사용하십시오. 그만큼 -u (통합) 옵션은 patch 패치 파일에 통합 된 컨텍스트 라인이 포함되어 있음을 알고 있어야합니다. 다시 말해, -u 옵션을 diff와 함께 사용했기 때문에 -u 옵션 patch.

패치 -u working.slang.c -i slang.patch

터미널 창에서 -u working.slang.c -i slang.patch 패치

모든 것이 잘 진행되면 한 줄의 결과물이 나타납니다. patch 파일을 패치하고 있습니다.

원본 파일 백업

우리는 지시 할 수 있습니다 patch 패치 파일을 사용하여 패치 파일을 변경하기 전에 백업 사본을 만들려면 -b (백업) 옵션. 그만큼 -i (입력) 옵션은 patch에게 사용할 패치 파일의 이름을 알려줍니다 :

patch -u -b working.slang.c -i slang.patch

터미널 창의 patch -u working.slang.c -i slang.patch

파일은 이전과 같이 패치되어 출력에 눈에 띄는 차이가 없습니다. 그러나 작업 폴더를 살펴보면 slang.c.orig라는 파일이 생성 된 것을 볼 수 있습니다. 파일의 날짜 및 시간 소인은 slang.c.orig가 원본 파일이고 slang.c가 다음에 의해 작성된 새 파일임을 표시합니다. patch.

터미널 창에서 ls 출력

디렉토리와 함께 diff 사용

사용할 수있다 diff 두 디렉토리에있는 파일 간의 모든 차이점을 포함하는 패치 파일을 작성합니다. 그런 다음 해당 패치 파일을 patch 단일 명령으로 작업 폴더의 파일에 이러한 차이를 적용합니다.

우리가 사용할 옵션 diff 입니다 -u 이전에 사용한 (통합 컨텍스트) 옵션 -r (재귀) 옵션 만들기 diff 하위 디렉토리를 살펴보고 -N (새 파일) 옵션.

그만큼 -N 옵션은 말한다 diff 작업 디렉토리에없는 최신 디렉토리에서 파일을 처리하는 방법 그것은 힘 diff 패치 파일에 지침을 넣어서patch 최신 디렉토리에는 있지만 작업 디렉토리에는없는 파일을 작성합니다.

단일 하이픈 (-).

우리는 디렉토리 이름 만 제공하고 있지만 말하지는 않습니다. diff 특정 파일을 보려면 :

diff -ruN working/ latest/ > slang.patch

diff -ruN working / latest /> slang.patch

패치 파일 내부 엿보기

패치 파일을 간단히 살펴 보겠습니다. 우리는 사용할 것이다 less 그 내용을 볼 수 있습니다.

터미널 창에서 덜 slang.patch

파일 상단에는 slang.c의 두 버전 간의 차이점이 표시됩니다.

터미널 창에서 ile의 상단을 표시하는 덜 slang.patch

패치 파일을 아래로 스크롤하면 structs.h라는 다른 파일의 변경 사항을 설명합니다. 이는 패치 파일에 여러 버전의 여러 파일 간의 차이점이 포함되어 있는지 확인합니다.

터미널 창에서 파일의 중간을 보여주는 덜 slang.patch

당신이 도약하기 전에 봐

대량의 파일 모음을 패치하면 약간 문제가 될 수 있으므로 --dry-run 우리가 뛰어 들기 전에 모든 것을 확인하는 옵션은 괜찮습니다.

그만큼 --dry-run 옵션은 말한다 patch 실제로 파일을 수정하는 것 외에 모든 것을 수행합니다. patch 파일에 대한 모든 비행 전 검사를 수행하고 문제가 발생하면이를보고합니다. 어느 쪽이든 파일이 수정되지 않습니다.

아무런 문제가보고되지 않으면 --dry-run 옵션으로 자신있게 파일을 패치하십시오.

그만큼 -d (디렉토리) 옵션 tell patch 작업 할 디렉토리

우리는 아니 사용하여 -i 말할 (입력) 옵션 patch 어느 패치 파일에서 지침을 포함 diff. 대신 패치 파일을 patch<.

patch --dry-run -ruN -d working < slang.patch

<img class = "alignnone size-full wp-image-421261"src = "https://www.howtogeek.com/wp-content/uploads/2019/05/xpatch_14.png.pagespeed.gp+jp+jw+ pj + ws + js + rj + rp + rw + ri + cp + md.ic.EN3xXcFRY6.png "alt ="patch --dry-run -ruN -d 작동 < slang.patch in a terminal window" width="646" height="122" onload="pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);" onerror="this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);">

전체 디렉토리에서 diff 패치 할 두 파일을 찾았습니다. 이 두 파일의 수정 사항에 대한 지침은 다음을 통해 확인되었습니다. patch 문제가보고되지 않았습니다.

비행 전 점검은 정상입니다. 이륙 준비가되었습니다.

디렉토리 패치

파일에 패치를 실제로 적용하기 위해 이전 명령을 --dry-run 선택권.

patch -ruN -d working < slang.patch

<img class = "alignnone size-full wp-image-421274"src = "https://www.howtogeek.com/wp-content/uploads/2019/05/patch_16.png"alt = "patch -ruN -d 일 < slang.patch in a terminal window" width="646" height="122" onload="pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);" onerror="this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);">

이번에는 각 출력 줄이 "확인"으로 시작하지 않고 각 줄은 "패칭"으로 시작합니다.

그리고 아무 문제도보고되지 않았습니다. 소스 코드를 컴파일 할 수 있으며 최신 버전의 소프트웨어를 사용할 수 있습니다.

차이점을 해결하십시오

이것은 사용하기 가장 쉽고 안전한 방법입니다 patch. 대상 파일을 폴더에 복사하고 해당 폴더를 패치하십시오. 패치 프로세스가 오류없이 완료되었다고 생각되면 다시 복사하십시오.