前言
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
- 「|」 表示前後兩個檔案內容有不同。
- 「<」 表示後面檔案比前面檔案少了一行內容。
- 「>」 表示後面檔案比前面檔案多了一行內容。