1. 程式人生 > 實用技巧 >檔案/目錄對比:diff命令

檔案/目錄對比:diff命令

命令格式

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

Linux diff命令用於比較檔案的差異。

  • diff以逐行的方式,比較文字檔案的異同處。
  • 如果指定要比較目錄,diff會比較目錄中相同檔名的檔案,但不會比較其中子目錄。
  • diff程式的輸出被稱為補丁(patch),Linux系統中還有一個patch程式,可以根據diff的輸出將a.c的檔案內容更新為b.c
    • 打補丁:patch file patch.log

命令引數

引數 描述
-行數 指定要顯示多少行的文字。此引數必須與-c或者-c引數一併使用。
-a 或者--text,diff預設只會逐行比較文字檔案
-b 或--ignore-space-change ,不檢查空格字元的不同。
-B 或--ignore-blank-lines ,不檢查空白行。
-c 顯示全部內容,並標出不同之處
-C行數 或--context行數 與執行"-c-行數"指令相同。
-i 或--ignore-case ,不檢查大小寫的不同。
-p 若比較的檔案為C語言的程式碼檔案時,顯示差異所在的函式名稱
-N 或--new-file ,在比較目錄時,若檔案A僅出現在某個目錄中,預設會顯示:Only in目錄:檔案A若使用-N引數,則diff會將檔案A與一個空白的檔案比較。
-P 或--unidirectional-new-file ,與-N類似,但只有當第二個目錄包含了一個第一個目錄所沒有的檔案時,才會將這個檔案與空白的檔案做比較。
-r 比較子目錄中的檔案
-v 顯示版本資訊
-w 或--ignore-all-space , 忽略全部的空格字元。
-W 或--width , 在使用-y引數時,指定欄寬。
-x 或--exclude , 不比較選項中所指定的檔案或目錄。
-X 或--exclude-from , 您可以將檔案或目錄型別存成文字檔案,然後在=中指定此文字檔案。
-y 或--side-by-side ,以並列的方式顯示檔案的異同之處。
--left-column 在使用-y引數時,若兩個檔案某一行內容相同,則僅在左側的欄位顯示該行內容。
--suppress-common-lines 在使用-y引數時,僅顯示不同之處。

具體使用

預設格式的diff:diff file1 file2

2c2
< world
---
> world2
3a4
> hell
5d5
< river
  • 它分成三個部分:前面的"4",表示f1的第4行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);後面的"4",表示變動後變成f2的第4行。
  • c:change,內容改變
  • a:addition,增加
  • d:deletion,刪除
  • ---用於分割f1和f2

上下文格式的diff:diff file1 file2 -c

-> autotest-runtask diff 1.txt 2.txt  -c
*** 1.txt	2020-08-09 18:09:24.000000000 +0800
--- 2.txt	2020-08-09 18:09:10.000000000 +0800
***************
*** 1,5 ****
  hello
! world
  goodbye
  moutain
- river
--- 1,5 ----
  hello
! world2
  goodbye
+ hell
  moutain

結果分成四部分:

  • 第一部分的兩行,顯示兩個檔案的基本情況:檔名和時間資訊
    • *** 表示變動前的檔案
    • --- 表示變動後的檔案
  • 第二部分:15個星號,將檔案的基本情況和變動內容分割開
  • 第三部分:顯示變動前的檔案
    • 1,5,表示行號
    • 檔案內容的每一行最前面,還有一個標記位:
      • 空:無變化;
      • !:該行有改動;
      • -:該行被刪除;
      • +:該行新增
  • 第四部分:顯示變動後的檔案

合併格式的diff:diff file1 file2 -u

➜  autotest-runtask diff 1.txt 2.txt  -u
--- 1.txt	2020-08-09 18:09:24.000000000 +0800
+++ 2.txt	2020-08-09 18:09:10.000000000 +0800
@@ -1,5 +1,5 @@
 hello
-world
+world2
 goodbye
+hell
 moutain
-river
  • 第一部分:檔案基本資訊
  • 第二部分:變動的部分用兩個@@作為起首和結束
    • -:表示第一個檔案;+表示第二個檔案
  • 第三部分:變動的具體內容

並排格式的diff:diff file1 file2 -y

➜  autotest-runtask diff 1.txt 2.txt -y
hello								hello
world							      |	world2
goodbye								goodbye
							      >	hell
moutain								moutain
river							      <
  • |:表示前後2個檔案內容有不同

  • <:表示前面檔案比後面檔案多了1行內容

  • >:表示前面檔案比後面檔案少了一行內容

比較目錄:diff 目錄1 目錄2

  • 只顯示不同行:diff -r 目錄1 目錄2 -y --suppress-common-lines