天天看點

Linux下diff的操作詳解

Linux下diff的操作詳解

總述

      Linux diff指令用于比較檔案的差異。diff以逐行的方式,比較文本檔案的異同處。特别是比較兩個版本不同的檔案,如果指定要比較目錄,則diff會比較目錄中相同檔案名的檔案,但不會比較其中子目錄。diff指令可以同時輸出成更新檔檔案,并且Linux中還有一個patch指令,可以依據diff生成的.patch更新檔檔案,将a.c與b.c兩個檔案差異部分更新到需要修改的檔案。此外diff在SVN 、GIT、CVS等版本控制工具中也是不可擷取的一部分。

      下面我就較長的描述一下diff指令的使用:

1指令格式

在Linux 中,我們可以使用 diff --help 檢視詳細指導(篇幅有限隻截圖了一部分作為展示)

常用指令格式:

diff[參數][檔案1或目錄1][檔案2或目錄2]

常用指令展示:

1.Linux核心diff自定義的更新檔

這個是我經常使用的指令,用來比較生成我修改後的代碼的更新檔包,最後用patch指令打更新檔到需要使用的核心源碼中去

Linux下diff的操作詳解

2.在git中也會有diff可以檢視兩次版本的差異

其中diff之後的版本号通過git log 列印出來進行比較

2指令參數詳細解釋

-<行數>:指定要顯示多少行的文本。此參數必須與-c或-u參數一并使用;

-a或--text:diff預設隻會逐行比較文本檔案;

-b或--ignore-space-change:不檢查空格字元的不同;

-B或--ignore-blank-lines:不檢查空白行;

-c:顯示全部内容,并标出不同之處;

-C<行數>或--context<行數>:與執行“-c-<行數>”指令相同;

-d或——minimal:使用不同的演算法,以小的機關來做比較;

-D<巨集名稱>或ifdef<巨集名稱>:此參數的輸出格式可用于前置處理器巨集;

-e或——ed:此參數的輸出格式可用于ed的script檔案;

-f或-forward-ed:輸出的格式類似ed的script檔案,但按照原來檔案的順序來顯示不同處;

-H或--speed-large-files:比較大檔案時,可加快速度;

-l<字元或字元串>或--ignore-matching-lines<字元或字元串>:若兩個檔案在某幾行有所不同,而這幾行同時都包含了選項中指定的字元或字元串,則不顯示這兩個檔案的差異;

-i或--ignore-case:不檢查大小寫的不同;

-l或——paginate:将結果交由pr程式來分頁;

-n或——rcs:将比較結果以RCS的格式來顯示;

-N或--new-file:在比較目錄時,若檔案A僅出現在某個目錄中,預設會顯示:Only in目錄,檔案A 若使用-N參數,則diff會将檔案A 與一個空白的檔案比較;

-p:若比較的檔案為C語言的程式碼檔案時,顯示差異所在的函數名稱;

-P或--unidirectional-new-file:與-N類似,但隻有當第二個目錄包含了第一個目錄所沒有的檔案時,才會将這個檔案與空白的檔案做比較;

-q或--brief:僅顯示有無差異,不顯示詳細的資訊;

-r或——recursive:比較子目錄中的檔案;

-s或--report-identical-files:若沒有發現任何差異,仍然顯示資訊;

-S<檔案>或--starting-file<檔案>:在比較目錄時,從指定的檔案開始比較;

-t或--expand-tabs:在輸出時,将tab字元展開;

-T或--initial-tab:在每行前面加上tab字元以便對齊;

-u,-U<列數>或--unified=<列數>:以合并的方式來顯示檔案内容的不同;

-v或——version:顯示版本資訊;

3diff輸出的檔案解釋

說完了diff指令的操作,我們再來看看diff指令輸出檔案,因為有時候我們通過輸出資訊自己比對檔案的差異結論。

1.diff直接輸出到終端顯示

Linux下diff的操作詳解

說明:

"<"表示後面檔案比前面檔案少了1行内容

">"表示後面檔案比前面檔案多了1行内容

2.diff直接輸出為patch檔案檢視

Linux下diff的操作詳解

如圖所示,我打開了我對比核心代碼之後生成的.patch檔案為例:

裡面有每個檔案都會标注

第一部分,也是檔案的基本資訊:

--- linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd  1970-01-01 08:00:00.000000000 +0800

+++ linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd  2020-08-21 10:54:52.774658500 +0800

"---"表示變動前的檔案,"+++"表示變動後的檔案。

第二部分,變動的位置用兩個@作為起首和結束。

   @@ -0,0 +1,80 @@

前面的"-0,0"分成三個部分:減号表示第一個檔案(即linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd),"0"表示第0行,後一個"0"表示連續0行;同樣的,"+1,10",加号表示第二個檔案,就表示下面是第二個檔案從第1行開始的連續80行。

通過這些資訊我們就可以看懂對比之後檔案的差異處了,是不是很容易呢。

 這就是我分享的linux下diff指令,如果大家有什麼更好的思路,歡迎分享交流哈。

Linux下diff的操作詳解

繼續閱讀