本文將要討論的是diff命令,diff用來比較兩個文件。固然文件比較的工具不少,windows系統下面就有不錯的工具可使用,例如經常使用的Beyond Compare,WinMerge都是圖形界面的比較工具並且使用很是方便,若是你僅僅是在windows下工做,這些GUI的比較工具絕對是首選。對於在linux環境下工做的人來講,若是每次想看兩個文件的區別都要將文件下載到windows環境而後用圖形工具進行比較實在是太麻煩了。那麼咱們必須學會使用linux環境下的比較工具diff。linux
diff分析兩個文件,並輸出兩個文件的不一樣的行。diff的輸出結果代表須要對一個文件作怎樣的操做以後才能與第二個文件相匹配。diff並不會改變文件的內容,可是diff能夠輸出一個ed腳原本應用這些改變。
如今讓咱們來看一下diff是如何工做的,假設有兩個文件:windows
//file1.txt
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.
//file2.txt
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.app
咱們使用diff比較他們的不一樣:
diff file1.txt file2.txt工具
輸出以下結果:
2,4c2,4
< I need to run the laundry.
< I need to wash the dog.
< I need to get the car detailed.
---
> I need to do the laundry.
> I need to wash the car.
> I need to get the dog detailed.spa
咱們來講明一下該輸出結果的含義,要明白diff比較結果的含義,咱們必須牢記一點,diff描述兩個文件不一樣的方式是告訴咱們怎麼樣改變第一個文件以後與第二個文件匹配。咱們看看上面的比較結果中的第一行 2,4c2,4 前面的數字2,4表示第一個文件中的行,中間有一個字母c表示須要在第一個文件上作的操做(a=add,c=change,d=delete),後面的數字2,4表示第二個文件中的行。命令行
2,4c2,4 的含義是:第一個文件中的第[2,4]行(注意這是一個閉合區間,包括第2行和第4行)須要作出修改才能與第二個文件中的[2,4]行相匹配。
接下來的內容則告訴咱們須要修改的地方,前面帶 < 的部分表示左邊文件的第[2,4]行的內容,而帶> 的部分表示右邊文件的第[2,4]行的內容,中間的 --- 則是兩個文件內容的分隔符號。3d
上面的部分咱們說明了如何查看diff命令的結果,實際上對於上面的比較,咱們使用的是diff命令的Normal模式,這也是diff命令的默認模式,也就是說diff兩個文件的時候若是不加模式參數則是默認模式進行比較,其效果與(--normal)同樣,咱們舉一些例子來講明Normal模式下的輸出結果(前面已經說明了一種比較結果),爲了直觀查看兩個文件的不一樣我在windows下面經過BeyondCompare工具列出兩個文件的不一樣,而截圖下面的黑色部分則是diff的比較輸出截圖。版本控制
第一個文件比第二個文件少了行的狀況:orm
第一個文件比第二個文件多出行的狀況:blog
第一個文件與第二個文件不相同的狀況:
以上diff命令執行的時候沒有指定額外的模式參數,因此其使用的是默認的Normal模式,效果與添加命令行參數--normal 是同樣的。
默認狀況下的模式輸出結果其實是符合計算機的思惟方式,不太直觀,因此其輸出結果並不可以很好的被人理解,diff命令除了默認模式以外還提供了另外兩種模式,Context和Unified模式,本節咱們說說如何查閱Context模式下的輸出結果。diff命令應用Context模式只須要添加命令行參數 diff -c 便可,咱們先看看兩個案例文件:
接下來講明這兩個文件以diff -c 方式比較的結果:
diff還有一種比較方式,也即Unified模式,使用命令行 –u 來執行該模式的比較。其比較結果與Context模式很像,可是簡化了一些輸出,咱們看看咱們的案例文件,與上面的同樣:
使用diff –u 比較的結果:
能夠看到其比較結果與Context模式實際上差很少,只不過將比較結果合併到一塊兒了。
使用diff能夠比較兩個目錄,其比較格式是 diff directory1 directory2 查看以下目錄比較結果:
比較兩個目錄的時候無非是有的文件僅僅存在於某個目錄中而在另外一個目錄中沒有,若是存在同名的文件,則比較這兩個文件的不一樣。diff比較目錄的結果咱們能夠結合grep命令篩選出咱們想要的輸出,例如僅僅輸出兩個目錄下不一樣的文件而忽略掉某一個目錄獨有另外一個目錄不存在的輸出記錄。
另外比較目錄的時候有兩個參數頗有用,-r 和 -q ,前者表示遞歸比較目錄中的子目錄,後者表示僅僅列出兩個目錄中有哪些文件不一樣,而不去比較目錄中各個文件的具體內容。特別是在做版本控制的時候,比較的兩個目錄若是文件不少,咱們可能只須要知道兩個目錄有那些文件有差別就好了,而不須要diff列出具體的差別內容,由於文件不少,默認狀況下diff會輸出兩個目錄全部不一樣文件的內容差別,這會使得輸出不少很雜亂,加上-q以後則只會輸出不一樣的文件名。
diff -r -q directory1 direcotory2
diff還提供了一些有用的參數來控制比較行爲與輸出結果,一些經常使用的參數以下:
-b --ignore-space-change 忽略空格,若是兩行進行比較,多個連續的空格會被看成一個空格處理,同時會忽略掉行尾的空格差別。
-w --ignore-all-space 忽略全部空格,忽略範圍比-b更大,包括不少不可見的字符都會忽略。
-B 忽略空白行。
-y 輸出兩列,一個文件一列,有點相似GUI的輸出外觀了,這種方式輸出更加直觀。
-W 大寫W,當指定-y的時候設置列的寬度,默認是130
-x, --exclude=PAT 比較目錄的時候排除指定PAT模式的文件名的比較
-i, --ignore-case 忽略兩個文件中大小寫的不一樣
-e 將比較的結果保存成一個ed腳本,以後ed程序能夠執行該腳本文件,從而將file1修改爲與file2的內容相同,這通常在patch的時候有用。
-r 若是比較兩個目錄,-r參數會比較其下同名的子目錄
-q 輸出結果中,只指出兩個文件不一樣,而不輸出兩個文件具體內容的比較,這在比較兩個目錄的時候很好用。咱們只須要知道兩個目錄下那些文件作了修改,而不須要知道每一個文件具體修改了那些內容。特別是當兩個目錄文件不少的時候。
diff -e 1.txt 2.txt > script.txt
這樣就是生成了一個ed能夠執行的腳本文件script.txt,生成腳本文件以後咱們還須要作一個操做, 在腳本文件末尾添加ed的write指令,只須要執行 echo "w" >>script.txt 將w指令附加到腳本文件的最後一行便可。
那麼如何應用該腳本文件呢,能夠這樣使用:
ed - 1.txt < script.txt
注意中間的 – 符號表示從標準輸入中讀取,而 < script.txt 則重定向script.txt的內容到標準輸入。這樣執行以後1.txt的內容將與2.txt徹底相同。
若是您以爲這篇文章對您有幫助,須要您的【贊】,讓更多的人也能看見哦