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函數的變化vim
-q,--brief 僅輸出文件是否有差別,不報告詳細差別ide
-r,--recursive 當比較目錄時,遞歸比較全部找到的子目錄函數
-s,--report-identical-files 當兩個文件相同時報告this
-S FILE,--starting-file=FILE 在比較目錄時,從FILE開始。用於繼續中斷的比較編碼
-t,--expand-tabs 將輸出時擴展Tab轉換爲空格,保護輸入文件的tab對齊方式spa
-T,--initial-tab 經過預先設置的tab使選項卡對齊(???)3d
-u,-U NUM,--unified[=NUM] 使用統一輸出格式(輸出一個總體,只有在差別的地方會輸出差別點,並標註出來),輸出NUM(默認3)行的上下文(上下各NUM行,不包括差別行)regexp
-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