Linux下diff與patch命令的配合使用

2021-06-22 14:45:10 字數 4421 閱讀 1854

在linux下,diff與patch命令配合使用可以進行簡單的**維護工作。

[a] diff

diff命令用於比較檔案的差異,可以用於製作patch檔案。但此命令引數眾多、格式多樣,所以在此僅介紹較常用的格式。

例如有以下2個檔案,原始檔為old/test.txt,經修改後的新檔案為new/test.txt,其內容分別如下:

old/test.txt:

this is the first line!

this is the second line!

this is the third line!

this is the fourth line!

this is the fifth line!

this is the sixth line!

this is the seventh line!

this is the eighth line!

this is the ninth line!

this is the tenth line!

this is the end~

new/test.txt:

this is the first line!

this is the 2 line!

this is the third line!

this is the fourth line!

this is the fifth line!

this is the sixth line!

this is the eighth line!

this is the ninth line!

this is the tenth line!

this is the 11 line!

this is the end~

a.1.1 格式一

命令:diff old/test.txt new/test.txt

返回:2c2

< this is the second line!

---> this is the 2 line!

7d6< this is the seventh line!

10a10

> this is the 11 line!

注:此為不帶任何引數的預設格式。

返回內容中符號與數字的含義分述如下:

c 代表被標示的行被修改,d 代表被標示的行被刪除,a 代表被標示的行被插入;字母前的數字代表原始檔的行號,字母後的數字代表新檔案的行號;< 符號之後的代表原始檔的內容,> 符號之後的代表新檔案的內容,--- 符號代表修改前後的分隔符。

例如:上述的2c2部分表示:原始檔第2行由this is the second line!改為this is the 2 line!,修改後的行號依然是2。

上述的7d6部分表示:原始檔第7行的this is the seventh line!內容被刪除,修改後的行號變為6。因為被整行刪除,所以少了一行。

a.1.2 格式二

命令:diff -nur old/test.txt new/test.txt

返回:--- old/test.txt        2011-09-29 17:06:20.505459007 +0800

+++ new/test.txt        2011-09-29 17:07:59.113458999 +0800

@@ -1,12 +1,12 @@

this is the first line!

-this is the second line!

+this is the 2 line!

this is the third line!

this is the fourth line!

this is the fifth line!

this is the sixth line!

-this is the seventh line!

this is the eighth line!

this is the ninth line!

this is the tenth line!

+this is the 11 line!

this is the end~

注:此為較常用的格式。各引數含義:n(或--new-file)表示如果某個檔案僅在乙個目錄中出現,則假定其在另乙個目錄中為空檔案;u(或-u《列數》、--unified=《列數》)表示以合併的方式顯示檔案內容的不同;r(或--recursive)表示比較子目錄中的檔案。

返回內容中符號與數字的含義分述如下:

開頭2行為檔案路徑與修改時間的描述,--- 之後的代表原始檔,+++ 之後的代表新檔案。第3行@@之間的部分,- 之後的數字代表原始檔的行號範圍,+ 之後的數字代表新檔案的行號範圍。餘下的正文部分中,- 之後的行代表原始檔的內容,亦即需要刪除的內容;+ 之後的行代表新檔案的內容,亦即需要新增的內容;不含有符號的各行代表沒有變化,只是引用的上下文。

a.1.3 格式三

命令:git diff old/test.txt new/test.txt

返回:diff --git a/old/test.txt b/new/test.txt

index fc5b2e4..63e3519 100644

--- a/old/test.txt

+++ b/new/test.txt

@@ -1,12 +1,12 @@

this is the first line!

-this is the second line!

+this is the 2 line!

this is the third line!

this is the fourth line!

this is the fifth line!

this is the sixth line!

-this is the seventh line!

this is the eighth line!

this is the ninth line!

this is the tenth line!

+this is the 11 line!

this is the end~

注:此為git命令,如果當前linux系統未安裝git,則無法使用此格式。此方法與格式二的返回內容相似,但是書寫簡單,無需新增引數。

返回內容中符號與數字的含義分述如下:

第1行標明了原始檔與新檔案的路徑,系統會自動新增a、b用來標識原始檔與新檔案,而實際上並不存在a、b目錄。

第2行為index索引資訊,不影響正文內容,所以無需理會。

第3行及以後的內容與格式二中的對應部分大體一致,在此不再贅述。

a.2 生成patch檔案

要想生成patch檔案,只需將diff命令的返回內容重定向到乙個文字檔案中即可。

例如:diff -nur old new > test.patch

注:上述命令將目錄作為引數進行比較。

[b] patch

patch命令可以利用diff命令生成的patch檔案進行檔案的更新。

注:如果只返回patching file ***,則代表更新成功;如果還提示hunk #1 failed at *,則表示更新失敗,原因可能是檔案已進行其他修改,此時就需要根據提示的出錯的行號手動更新了。

b.1.1 格式一

通過此格式生成的patch檔案由於缺少檔案路徑的標註,所以需要指定待更新的檔案路徑。

命令:patch old/test.txt < test.patch

b.1.2 格式二

通過此格式生成的patch檔案中會包含檔案路徑,所以無需指定檔案路徑的引數,但是要指定檔案路徑層級。

命令:patch -p0 < test.patch

注:引數-p(或--strip=《剝離層級》)表示欲剝離幾層路徑名稱。此例中patch檔案中的路徑為:old/test.txt,所以當test.patch檔案與old目錄處於同一目錄時,則不需要剝離檔案路徑,所以用-p0。

如果將test.patch檔案移動到old目錄下,亦即test.patch檔案與test.txt檔案處於相同目錄時,則需要剝離一層路徑,亦即忽略old路徑,所以要將引數改為-p1。以此類推。

b.1.3 格式三

與格式二的patch方式相似,不過因其自動新增了一層目錄a、b,導致其剝離層級比格式二大1。

命令:patch -p1 < test.patch

b.2 撤銷patch

如果執行patch之後,卻發現此patch修改的部分有誤,需要還原修改前的檔案;或者由於其他原因,需要獲取修改前的檔案狀態。在沒有改動的前提下,原始檔是可以無損還原的。

命令:patch -p1 -r < test.patch

注:撤銷patch其實很簡單,只需要在打patch的命令上新增-r的引數即可。不過前提是:原始檔與patch檔案沒有其他修改,而且原始檔與patch檔案的相對路徑未發生變化。如果相對路徑發生變化,需要適當調整-p引數的路徑剝離層級。

Linux下diff命令與patch命令使用

1 製作補丁 diff的使用 diff可以完成比較功能,生成補丁檔案 格式 diff option oldfile newfile 常用的option選項有 n 補丁中包含整個新檔案 a 補丁中包含二進位制檔案 預設時,diff向標準輸出列印,所以一般都重定向到檔案並以patch為字尾,也就是所謂的...

linux下diff命令與patch命令使用

1 製作補丁 diff的使用 diff可以完成比較功能,生成補丁檔案 格式 diff option oldfile newfile 常用的option選項有 r 對目錄進行遞迴處理 u 輸出統一格式,diff有 傳統 和 統一 兩種格式,現在一般使用 統一 格式,比較而言,統一格式生成的檔案大,但包...

linux下Diff命令使用方法

1 diff命令的功能 linux中diff命令的功能為逐行比較兩個文字檔案,列出其不同之處。它對給出的檔案進行系統的檢查,並顯示出兩個檔案中所有不同的行,不要求事先對檔案進行排序。2 語法 diff options file1 file2 該命令告訴使用者,為了使兩個檔案file1和file2一致...