zoukankan      html  css  js  c++  java
  • Linux命令之diff

    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’00’ 八进制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

  • 相关阅读:
    jqGrid jqGrid 参数
    jqgrid问题总结
    quartz的配置表达式
    Struts2接收参数的几种方式
    Perl爬虫代码
    PHP官方的PECL扩展有问题
    Perl单URL爬虫
    Perl 多进程进度条
    Perl Tk摸索
    hdu 2058 数学题
  • 原文地址:https://www.cnblogs.com/diantong/p/9238348.html
Copyright © 2011-2022 走看看