Linux命令之diff 注:当两文件对比无变化时,$?值为0;有变化$?则不为0; 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< 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< dir:dir1 > name:text1 > > Total 4! > EOF [root@CentOS6 dir1]# cat>text2< I am MenAngel! > I am studying the order of Linux! > EOF [root@CentOS6 dir1]# cd ../dir2 [root@CentOS6 dir2]# cat>text1< dir:dir2 > name:text1 > > > Total 5! > EOF [root@CentOS6 dir2]# cat>text3< 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也可以比较文件 1 2 [xf@xuexi ~]$ vimdiff 1.txt 2.txt 还有 2 个文件等待编辑