Linux diff 命令

2020-08-13 00:17:35

前言

Linux 中比較兩個檔案是否一致有好幾種方式,前面已經講過了 cksum 命令來校驗兩個檔案是否一致,還講了利用 cmp 來比較兩個檔案是否有差異,今天來講一下另一個比較檔案差異的 diff 命令。

命令詳解

Linux diff 命令用於比較檔案的差異。
diff 以逐行的方式,比較文字檔案的異同處。如果指定要比較目錄,則 diff 會比較目錄中相同檔名的檔案,但不會比較其中子目錄。

命令全拼

diff = Difference

語法格式

diff [-abBcdefHilnNpPqrstTuvwy][-<行數>][-C <行數>][-D <巨集名稱>][-I <字元或字串>][-S <檔案>][-W <寬度>][-x <檔案或目錄>][-X <檔案>][–help][–left-column][–suppress-common-line][檔案或目錄1][檔案或目錄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: 顯示版本資訊。
  • -w或–ignore-all-space: 忽略全部的空格字元。
  • -W<寬度>或–width<寬度>: 在使用-y參數時,指定欄寬。
  • -x<檔名或目錄>或–exclude<檔名或目錄>: 不比較選項中所指定的檔案或目錄。
  • -X<檔案>或–exclude-from<檔案>: 您可以將檔案或目錄型別存成文字檔案,然後在=<檔案>中指定此文字檔案。
  • -y或–side-by-side: 以並列的方式顯示檔案的異同之處。
  • –help: 顯示幫助。
  • –left-column: 在使用-y參數時,若兩個檔案某一行內容相同,則僅在左側的欄位顯示該行內容。
  • –suppress-common-lines: 在使用-y參數時,僅顯示不同之處。

舉個栗子

上面看了一大堆參數,下面 下麪來看看 diff 命令的實際使用吧,首先準備兩個檔案 xiaoye.log 和 xiaofang.log,接着來比較這兩個檔案:
xiaoye.log

yeqiongzhou
region
shanghai

xiaofang.log

xiaofang
region
china

diff xiaoye.log xiaofang.log

輸出如下:

1c1
< yeqiongzhou
---
> xiaofang
3c3
< shanghai
---
> china

上面的"1c1"和"3c3"表示 xiaoye.log 和 xiaofang.log 檔案在第1行和第3行內容有所不同。

Tips

  • 「|」 表示前後兩個檔案內容有不同。
  • 「<」 表示後面檔案比前面檔案少了一行內容。
  • 「>」 表示後面檔案比前面檔案多了一行內容。