總述
linux diff命令用于比較文件的差異。diff以逐行的方式,比較文本文件的異同處。特別是比較兩個版本不同的文件,如果指定要比較目錄,則diff會比較目錄中相同文件名的文件,但不會比較其中的目錄。diff命令可以同時輸出成補丁文件,并且Linux中還有一個patch命令,可以依據diff生成的.patch補丁文件,將a.c與b.c兩個文件差異部分更新到需要修改的文件。此外diff在SVN 、GIT、CVS等版本控制工具中也是不可或缺的一部分。
下面我就詳細描述一下diff命令的使用:
作者:良知猶存
轉載授權以及圍觀:歡迎添加微信公眾號:羽林君
1 指令格式
在Linux 中,我們可以使用 diff --help 查看詳細指導(篇幅有限只截圖了一部分作為展示)
常用命令格式:
diff[參數][文件1或目錄1][文件2或目錄2]
常用命令展示:
1.Linux內核diff自定義的補丁
diff -ruN linux-4.19-rc3_lyn linux-4.19-rc3 > linux-4.19-rc3_lyn.patch
這個是我經常使用的命令,用來比較生成我修改后的代碼的補丁包,最后用patch命令打補丁到需要使用的內核源碼中去
?
2.在git中也會有diff可以查看兩次版本的差異
git diff 04120e84525eca1c590d30b84ce7463b9e8a1497 f88b0054170b99b149bd0fbe5f138c66c64dd1c6
其中diff之后的版本號通過git log 打印出來進行比較
?
2 命令參數詳細解釋
-<行數>:指定要顯示多少行的文本。此參數必須與-c或-u參數一并使用;
-a或--text:diff預設只會逐行比較文本文件;
-b或--ignore-space-change:不檢查空格字符的不同;
-B或--ignore-blank-lines:不檢查空白行;
-c:顯示全部內容,并標出不同之處;
-C<行數>或--context<行數>:與執行“-c-<行數>”指令相同;
-d或——minimal:使用不同的演算法,以小的單位來做比較;
-D<巨集名稱>或ifdef<巨集名稱>:此參數的輸出格式可用于前置處理器巨集;
-e或——ed:此參數的輸出格式可用于ed的script文件;
-f或-forward-ed:輸出的格式類似ed的script文件,但按照原來文件的順序來顯示不同處;
-H或--speed-large-files:比較大文件時,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異;
-i或--ignore-case:不檢查大小寫的不同;
-l或——paginate:將結果交由pr程序來分頁;
-n或——rcs:將比較結果以RCS的格式來顯示;
-N或--new-file:在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄,文件A 若使用-N參數,則diff會將文件A 與一個空白的文件比較;
-p:若比較的文件為C語言的程序碼文件時,顯示差異所在的函數名稱;
-P或--unidirectional-new-file:與-N類似,但只有當第二個目錄包含了第一個目錄所沒有的文件時,才會將這個文件與空白的文件做比較;
-q或--brief:僅顯示有無差異,不顯示詳細的信息;
-r或——recursive:比較子目錄中的文件;
-s或--report-identical-files:若沒有發現任何差異,仍然顯示信息;
-S<文件>或--starting-file<文件>:在比較目錄時,從指定的文件開始比較;
-t或--expand-tabs:在輸出時,將tab字符展開;
-T或--initial-tab:在每行前面加上tab字符以便對齊;
-u,-U<列數>或--unified=<列數>:以合并的方式來顯示文件內容的不同;
-v或——version:顯示版本信息;
3 diff輸出的文件解釋
說完了diff命令的操作,我們再來看看diff命令輸出文件,因為有時候我們通過輸出信息自己比對文件的差異結論。
1.diff直接輸出到終端顯示
?
說明:
- "<"表示后面文件比前面文件少了1行內容
- ">"表示后面文件比前面文件多了1行內容
2.diff直接輸出為patch文件查看
?
如圖所示,我打開了我對比內核代碼之后生成的.patch文件為例:
里面有每個文件都會標注
Binary files linux-4.19-rc3_lyn/arch/arm/boot/compressed/ashldi3.o and linux-4.19-rc3/arch/arm/boot/compressed/ashldi3.o differ
diff -ruN linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd
--- linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd 1970-01-01 08:00:00.000000000 +0800
+++ linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd 2020-08-21 10:54:52.774658500 +0800
@@ -0,0 +1,80 @@
+cmd_arch/arm/boot/compressed/ashldi3.o := arm-linux-gnueabi-gcc -Wp,-MD,arch/arm/boot/compressed/.ashldi3.o.d -nostdinc -isystem /work/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/.. /lib/gcc/arm-linux-gnueabi/4.9.4/include -I./arch/arm/include -I./arch/arm/include/generated -I./include -I./arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I./include/uapi -I./include/ge nerated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -Iarch/arm/mach-s3c24xx/include -Iarch/arm/plat-samsung/include -D__ASSEMBLY__ -fno-PIE -DCC_HAVE_ASM_GOTO -funwind-tables -marm -Wa,-mno- warn-deprecated -D__LINUX_ARM_ARCH__=4 -march=armv4t -mtune=arm9tdmi -include asm/unified.h -msoft-float -Wa,-gdwarf-2 -DZIMAGE -c -o arch/arm/boot/compressed/ashldi3.o arch/arm/boot/compressed/ash ldi3.S
+
+source_arch/arm/boot/compressed/ashldi3.o := arch/arm/boot/compressed/ashldi3.S
+
+deps_arch/arm/boot/compressed/ashldi3.o :=
第一部分,也是文件的基本信息:
--- linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd 1970-01-01 08:00:00.000000000 +0800
+++ linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd 2020-08-21 10:54:52.774658500 +0800
"---"表示變動前的文件,"+++"表示變動后的文件。
第二部分,變動的位置用兩個@作為起首和結束。
@@ -0,0 +1,80 @@
前面的"-0,0"分成三個部分:減號表示第一個文件(即linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd),"0"表示第0行,后一個"0"表示連續0行;同樣的,"+1,10",加號表示第二個文件,就表示下面是第二個文件從第1行開始的連續80行。
通過這些信息我們就可以看懂對比之后文件的差異處了,是不是很容易呢。
這就是我分享的linux下diff命令,如果大家有什么更好的思路,歡迎分享交流哈。