1. 程式人生 > >Linux下diff命令用法詳解

Linux下diff命令用法詳解

大家好,我是良許。 我們在平時工作的時候,經常要知道兩個檔案之間,以及同個檔案不同版本之間有何異同點。在 Windows 下,有 beyond compare 這個好用的工具,而在 Linux 下,也有很多很強大的工具,良許之前也寫過一篇文章介紹: [Linux下9種優秀的程式碼比對工具推薦](https://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=2247491621&idx=2&sn=19ada5e2b8ecddfbbc65e191d296f0e4&chksm=fd1f98a3ca6811b59d26f76b4034e6cbf0df1195b954103827e117f0ccf589c87eaac8b044d8&token=1541238771&lang=zh_CN#rd) 這些比對工具其實都是基於 `diff` 命令,下面就詳細介紹一些 diff 命令的用法。 **diff** 命令是一個分析檔案資訊的命令,可以打印出檔案之間的差異。它可以逐行地比較兩個檔案的內容,也可以遞迴地比較資料夾的內容。**diff** 命令的輸出內容可以讓我們知道要使兩個檔案相同需要做哪些修改,這對於我們的工作很有幫助。 在開始前,我們先用檔案編輯器建立兩個內容相同的檔案。這裡我們使用的是 **nano** 。 ```shell $ nano diffsample1 ``` 輸入內容: >釋出 > >優質的 > >技術文章 [![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213648587-398050512.png)](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213648587-398050512.png) 使用 `Ctrl`+`X` 和 `Y` 儲存並退出。 建立第二個檔案: ```shell $ nano diffsample2 ``` 輸入同樣的內容並儲存退出。 需要注意的是,空格和 `Tab` 對兩個檔案是否完全相同會有影響。 使用 **diff** 命令檢視兩個檔案是否有差異: ```shell $ diff diffsample1 diffsample2 ``` 這時 **diff** 命令沒有輸出任何資訊,說明這兩個檔案的內容是完全相同的。 現在我們對 diffsample2 做一些修改,將**文章**改為**帖子**然後儲存並退出 ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213648817-632031942.png) 再使用 **diff** 命令: ```shell $ diff diffsample1 diffsample2 ``` 檢視輸出的資訊: ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213648992-1665859717.png) 在以上輸出資訊中,**3c3** 表示第一個檔案的第三行需要被替換為第二個檔案的第三行,然後為我們提示出了需要修改的內容: **技術文章** 和 **技術帖子** **diff** 命令所參考的不是第一個檔案,而是第二個檔案,它的輸出資訊有以下幾種字元: **c** : 表示必須做一些修改 **a** : 表示必須新增一些內容 **d** : 表示必須刪除一些內容 字元前的數字表示第一個檔案中的行數,字元後的內容表示第二個檔案中的行數。 **<** 表示引用的第一個檔案中的內容,而 **>** 表示引用的第一個檔案中的內容 現在讓我們交換兩個檔案的順序再試試: ```shell $ diff diffsample2 diffsample1 ``` ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649138-1802378987.png) 在交換檔案順序之後 **diff** 參考的檔案變成了 diffsample1,提示我們將 **技術帖子** 修改為 **技術文章** 。 現在我們將 diffsample1 編輯為以下內容: ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649311-499064639.png) 刪除了第二行和第三行,再試試使用 **diff** 命令 ```shell $ diff diffsample2 diffsample1 ``` ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649495-875476918.png) 現在我們可以看到,因為我們以 diffsample1 作為參考,為了使兩個檔案相同,我們需要刪除 diffsample2 中的第二行和第三行,然後就會和 diffsample1 中的第一行內容相同。 我們再試試交換 diffsample1 和 diffsample2 的順序: ```shell $ diff diffsample1 diffsample2 ``` ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649646-947470898.png) 可以看到,現在 **diff** 給我們的提示資訊變為了在 diffsample1 中的第一行後面新增 diffsample2 中的第二行和第三行內容。 現在讓我們來測試區分內容的大小寫: 編輯 diffsample1 的內容為: ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649797-198864733.png) 編輯 diffsample1 的內容為: ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213649972-1051254891.png) 兩個檔案中唯一的區別是第三行的大小寫,再試試 **diff** 命令 ```shell $ diff diffsample1 diffsample2 ``` ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213650186-75384616.png) 可以看到 **diff** 命令找出了大小寫的不同,如果我們不想檢查大小寫,可以使用 **-i** 選項。 ```shell $ diff -i diffsample1 diffsample2 ``` 這時內容沒有區別,**diff** 沒有輸出任何資訊。 我們可以使用 **-u** 選項以統一的格式輸出資訊: ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213650389-893846654.png) 輸出資訊中使用 **-** 和 **+** 表示哪些內容需要被刪除或者新增來使得檔案內容相同。 之前提到過 **diff** 命令會檢查空格或tab,如果我們想要忽略空格和tab,可以使用 **-w** 選項。 在 diffsample2 的第二行 good 後面輸入一些空格和tab,並把之前的大寫改回小寫。 ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213650644-763464183.png) 再使用 **diff** 命令 ```shell $ diff diffsample1 diffsample2 ``` ![](https://img2020.cnblogs.com/other/1218435/202007/1218435-20200708213650810-984665895.png) 可以看到找出了不同,再使用 **-w** 忽略空格和tab,這時便沒有任何輸出資訊了。 **diff** 命令還有許多選項,可以用來忽略某些情況或者更改輸出等,我們可以使用 **man** 命令來獲取更多的相關資訊。 --- 公眾號:良許Linux ### 有收穫?希望老鐵們來個三連擊,給更多的人看到這