Linux命令之diff


diff [選項] … [文件1或目錄1] [文件2或目錄2](四種組合方式)
說明:diff命令在最簡單的情況下,比較兩個文件的不同。如果使用”-”代替文件參數,則要比較的內容將來自標准輸入。Diff命令是以逐行的方式比較文本文件的異同之處。如果指定比較的是目錄的時候,diff命令會比較兩個目錄下名字相同的文本文件,但不會比較其中子目錄。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件
(1).選項
-a,--text 把所有文件當做文本文件逐行比較
-b,--ignore-space-change 忽略空格產生的變化
-B,--ignore-blank-lines 忽略空白行的變化
-c,–C NUM,--context[=NUM] 使用上下文輸出格式(文件1在上,文件2在下,在差異點會標注出來),輸出NUM(默認3)行的上下文(上下各NUM行,不包括差異行)
-d,--minimal 使用不同的算法,努力尋找一個較小的變化集合。這會使diff變慢(有時更慢)
-D NAME,--ifdef=NAME 合並if-then-else格式輸出,預處理宏(由NAME參數提供)條件
-e,--ed 輸出一個ed格式的腳本文件
-E,--ignore-all-space 忽略由於Tab擴展而導致的變化
-F RE,--show-function-line=RE 在上下文輸出格式(文件1在上,文件2在下)和統一輸出格式中,對於每一大塊的不同,顯示出匹配RE(regexp正則表達式)最近的行
-i,--ignore-case 忽略大小寫的區別
-I RE,--ignore-matching-lines=RE 忽略所有匹配RE(regexp正則表達式)的行的更改
-l,--paginate 通過pr編碼傳遞輸出,使其分頁
-n,--rcs 輸出RCS格式差異

-N,--new-file 把缺少的文件當做空白文件處理

-p,--show-c-function 顯示帶有C函數的變化

-q,--brief 僅輸出文件是否有差異,不報告詳細差異

-r,--recursive 當比較目錄時,遞歸比較所有找到的子目錄

-s,--report-identical-files 當兩個文件相同時報告

-S FILE,--starting-file=FILE 在比較目錄時,從FILE開始。用於繼續中斷的比較

-t,--expand-tabs 將輸出時擴展Tab轉換為空格,保護輸入文件的tab對齊方式

-T,--initial-tab 通過預先設置的tab使選項卡對齊(???)

-u,-U NUM,--unified[=NUM] 使用統一輸出格式(輸出一個整體,只有在差異的地方會輸出差異點,並標注出來),輸出NUM(默認3)行的上下文(上下各NUM行,不包括差異行)

-v,--version 輸出版本號

-w,--ignore-all-space 比較時忽略所有空格

-W NUM,--width=NUM 在並列輸出格式時,指定列的寬度為NUM(默認130)

-x PAT,--exclude=PAT 排除與PAT(pattern樣式)匹配的文件

-X FILE,--exclude-from=FILE 排除與FILE中樣式匹配的文件

-y,--side-by-side 使用並列輸出格式

--from-file=FILE1 FILE1與所有操作對象比較,FILE1可以是目錄

--help 輸出幫助信息

--horizon-lines=NUM 保留NUM行的公共前綴和后綴

--ignore-file-name-case 比較時忽略文件名大小寫

--label LABEL 使用LABEL(標識)代替文件名

--left-column (在並列輸出格式中)只輸出左列的公共行

--no- ignore-file-name-case 比較時考慮文件名大小寫

--normal 輸出一個正常的差異

--speed-large-files 假設文件十分大,而且有許多微小的差異

--strip-trailing-cr 去掉在輸入時尾隨的回車符

--suppress-common-lines 不輸出公共行

--to-file=FILE2 所有操作對象與FILE2比較,FILE2可以是目錄

--unidiredtional-newfile 將缺少的第一個文件視為空文件

 

--GTYPE-group-format=GFMT 以GFMT格式化GTYPE輸入組

--line-format=LFMT 以LFMT格式化輸入所有行

--LTYPE-line-format=LFMT 以LFMT格式化LTYPE輸入行

LTYPE可以是’old’,’new’或’unchanged’。GTYPE可以是LTYPE選項或’changed’

       GFMT包括:

              %< 該行屬於FILE1

              %> 該行屬於FILE2

              %= 該行屬於FILE1和FILE2公共行

              %[-][WIDTH(寬度)][.[PREC(精確度)]]{doxX}LETTER(字母) printf格式規范LETTER。如下字母表示屬於新的文件,小寫表示屬於舊的文件:

                     F 行組中第一行的行號

                     L 行組中最后一行的行號

                     N 行數(=L-F+1)

                     E F-1

                     M L+1

       LFMT可包含:

              %L 該行內容

              %l 該行內容,但不包括尾隨的換行符

              %[-][WIDTH][.[PREC]]{doxX}n printf格式規范輸入行編號

       GFMT或LFMT可包含:

       %% %

%c’C’ 單個字符C

%c’\000’ 八進制000所代表的字符

(2).實例

在沒有任何參數時,diff命令比較

[root@CentOS6 桌面]# cat>t1.txt<<EOF
> this is a text!
> 
> Name is t1.txt!
> The extra content!
> I am MenAngel!
> EOF
[root@CentOS6 桌面]# cat> t2.txt    //第二種cat建文件方式,Ctrl+Z退出編輯
this is a text!      

Name is t2.txt!
^Z
[1]+  Stopped                 cat > t2.txt
[root@CentOS6 桌面]# diff t1.txt t2.txt
3,5c3    //文件1中的第3行到第5行(3,5)改為(c)文件2中的第3行(3),則兩個文件相同。
< Name is t1.txt!    //<表示FILE1的行
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!    //>表示FILE2的行

 以並列輸出格式展示兩個文件的不同

[root@CentOS6 桌面]# diff -y t1.txt t2.txt
this is a text!							this is a text!

Name is t1.txt!						      |	Name is t2.txt!
The extra content!					      <
I am MenAngel!						      <

 並列輸出格式下控制寬度

[root@CentOS6 桌面]# diff -y -W 40 t1.txt t2.txt
this is a text!		this is a text!

Name is t1.txt!	   |	Name is t2.txt!
The extra conten   <
I am MenAngel!	   <

 以上下文輸出格式展示兩個文件的不同

[root@CentOS6 桌面]# diff -c t1.txt t2.txt 
*** t1.txt	2018-06-23 21:44:15.171207940 +0800    //*代表t1.txt
--- t2.txt	2018-06-23 21:44:54.987207910 +0800    //-代表t2.txt
***************
*** 1,5 ****    //從第1行到第5行
  this is a text!
  
! Name is t1.txt!    //!標注差異行
! The extra content!
! I am MenAngel!
--- 1,3 ----    //從第1行到第3行
  this is a text!
  
! Name is t2.txt!

以統一輸出格式展示兩個文件的不同

[root@CentOS6 桌面]# diff -u t1.txt t2.txt 
--- t1.txt	2018-06-23 21:44:15.171207940 +0800    //-代表t1.txt
+++ t2.txt	2018-06-23 21:44:54.987207910 +0800    //+代表t2.txt
@@ -1,5 +1,3 @@    //t1.txt第1行到第5行,t2.txt第1行到第3行
 this is a text!
 
-Name is t1.txt!    //-代表前面的文件比后面的文件多一行,+代表后面的文件比前面的文件多一行,一般一一對應
-The extra content!
-I am MenAngel!
+Name is t2.txt!

 文件交換對比位置所帶來的差距

[root@CentOS6 桌面]# diff -y -W 40 t2.txt t1.txt 
this is a text!		this is a text!

Name is t2.txt!	   |	Name is t1.txt!
		   >	The extra conten
		   >	I am MenAngel!
[root@CentOS6 桌面]# diff -c t2.txt t1.txt 
*** t2.txt	2018-06-23 21:44:54.987207910 +0800
--- t1.txt	2018-06-23 21:44:15.171207940 +0800
***************
*** 1,3 ****
  this is a text!
  
! Name is t2.txt!
--- 1,5 ----
  this is a text!
  
! Name is t1.txt!
! The extra content!
! I am MenAngel!
[root@CentOS6 桌面]# diff -u t2.txt t1.txt 
--- t2.txt	2018-06-23 21:44:54.987207910 +0800
+++ t1.txt	2018-06-23 21:44:15.171207940 +0800
@@ -1,3 +1,5 @@
 this is a text!
 
-Name is t2.txt!
+Name is t1.txt!
+The extra content!
+I am MenAngel!

目錄與目錄間的比較

[root@CentOS6 桌面]# mkdir dir1 dir2
[root@CentOS6 桌面]# cd dir1
[root@CentOS6 dir1]# cat>text1<<EOF
> dir:dir1
> name:text1
> 
> Total 4!
> EOF
[root@CentOS6 dir1]# cat>text2<<EOF
> I am MenAngel!
> I am studying the order of Linux!
> EOF
[root@CentOS6 dir1]# cd ../dir2
[root@CentOS6 dir2]# cat>text1<<EOF
> dir:dir2
> name:text1
> 
> 
> Total 5!
> EOF
[root@CentOS6 dir2]# cat>text3<<EOF
> Working hard makes success!
> I am MenAngel!
> EOF
[root@CentOS6 dir2]# cd ../
[root@CentOS6 桌面]# diff dir1 dir2
diff dir1/text1 dir2/text1    //有相同文件名時自動比較
1c1
< dir:dir1
---
> dir:dir2
4c4,5
< Total 4!
---
> 
> Total 5!
Only in dir1: text2    //只有dir1存在text2
Only in dir2: text3    //只有dir2存在text3

 生成log文件,diff的輸出文件被稱為補丁(patch),可以使用patch命令將文件內容更新

[root@CentOS6 桌面]# diff dir1 dir2>dir.log
[root@CentOS6 桌面]# cat dir.log
diff dir1/text1 dir2/text1
1c1
< dir:dir1
---
> dir:dir2
4c4,5
< Total 4!
---
> 
> Total 5!
Only in dir1: text2
Only in dir2: text3
[root@CentOS6 桌面]# diff t1.txt t2.txt >t12.log
[root@CentOS6 桌面]# cat t12.log 
3,5c3
< Name is t1.txt!
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!

(3).擴展

vimdiff也可以比較文件

[xf@xuexi ~]$ vimdiff 1.txt 2.txt 
還有 2 個文件等待編輯

顯示如下情況,退出編輯可以參考vim


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM