zoukankan      html  css  js  c++  java
  • diff 比较两个文件的差异


    功能:比较两个文件的差异,并把不同地方的信息显示出来。默认diff格式的信息。

    diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件。也使用patch命令对相应的文件打补丁。differential [ˌdɪfəˈrenʃəl]

    语法:diff    [options]   FILES
    FILES的格式:

    FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。
    DIR1 DIR2   :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。
    FILE DIR     :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。
    DIR FILE     :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。
    FILE可以是“-”,代表由标准输入设备读入的文本。DIR不能是"-"。
    被指定的文件不能是标准的输入。

    短选项 长选项 含义
    -i --ignore-case 忽略文件内容大小写的区别
      --ignore-file-name-case 忽略文件名大小写的区别
      --no-ignore-file-name-case 不忽略文件名大小写的区别
    -E --ignore-tab-expansion 忽略由制表符宽度造成的差异
    -b --ignore-space-change 忽略由空格数不同造成的差异
    -w --ignore-all-space 忽略所有空格
    -B --ignore-blank-lines 忽略任何因空行而造成的差异
    -I --ignore-matching-lines=RE 如果某行匹配正则表达式,则忽略由该行造成的差异
    -a --text 所有文件都以文本方式处理
      --strip-trailing-cr 去除输入内容每行末端的 carriage return 字符
    -c 或 或 -C 行数 --context[=行数] 显示指定<行数>(默认 3 行)copied 格式的上下文
    -u  或 -U 行数 --unified[=行数] 显示指定<行数>(默认 3 行)unified 格式的上下文(合并的方式)
      --label 标识 使用<标识>代替文件名称
    -p --show-c-function 显示和每个差异有关的 C 函数名称
    -F  --show-function-line=RE 显示最接近而符合<正则表示式>的一行
    -q --brief 只显示文件是否不同
    -e --ed 以 ed script 方式输出
      --normal 以正常的 diff 方式输出
    -n --rcs 以 RCS diff 格式输出
    -y --side-by-side 以两列并排的方式显示
    -W --width=NUM 每行显示最多 NUM (默认 130) 个字符
      --left-column 当有两行相同时只显示左边的一行
      --suppress-common-lines 当有两行相同时不会显示
    -D --ifdef=NAME 输出的内容以‘#ifdef NAME’方式标明差异
      --GTYPE-group-format=GFMT 效果类似,但会以 GFMT 格式处理 GTYPE 输入的行
    可以是LTYPE的选择或是‘changed’
      --line-format=LFMT 效果类似,但会以 LFMT 格式处理每一行资料
      --LTYPE-line-format=LFMT 效果类似,但会以 LFMT 格式处理 LTYPE 输入的行
    LTYPE 可以是‘old’、‘new’或‘unchanged’。
    -l --paginate 将输出送至‘pr’指令来分页
    -t --expand-tabs 将输出中的 tab 转换成空格
    -T --initial-tab 每行先加上 tab 字符,使 tab 字符可以对齐
      --tabsize=NUM 定位字符 (tab) 的宽度,默认为 8 个空格宽
      --suppress-blank-empty suppress space or tab before empty output lines
    -r --recursive 递归比较子目录中的文件
    -N --new-file 不存在的文件以空文件方式处理
      --unidirectional-new-file 若第一文件案不存在,以空文件处理
    -s --report-identical-files 文件相同则报告,否则无任何提示
    -x --exclude=PAT 排除匹配 PAT 的文件
    -X --exclude-from=FILE 排除所有匹配在 FILE 中列出的模式的文件
    -S --starting-file=FILE 当比较目录時,由 FILE 开始比较
      --from-file=FILE1 将 FILE1 和操作数中的所有文件/目录作比较。FILE1 可以是目录
      --to-file=FILE2 将操作数中的所有文件/目录和 FILE2 作比较。FILE2 可以是目录
      --horizon-lines=NUM keep NUM lines of the common prefix and suffix
    -d --minimal 尽可能找出最小的差异
      --speed-large-files 假设文件十分大而且其中含有许多微小的差异
    diff输出格式(默认):
    n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
    n1,n2 d n3 表示在n1到n2行之间删除n3行
    n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替换掉
    字母a:表示附加(add)
    字符c:表示修改(change)
    字符d:表示删除(delete)
    字母前的是源文件,字母后是目标文件。Nx表示行号。
    以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。

    比较文件

    log2014.log内容
    2013-01
    2013-02
    2014-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-07
    2013-09
    2013-10
    2013-11
    2013-12


    log2013.log内容
    2013-01
    2013-02
    2013-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-08
    2013-09
    2013-10


    比较两个文件
    [root@localhost test3]# diff log2014.log log2013.log   
    3c3
    < 2014-03
    ---
    > 2013-03
    8c8
    < 2013-07
    ---
    > 2013-08
    11,12d10
    < 2013-11
    < 2013-12
    上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。

    以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
     
     
     
    并排格式输出
    [root@localhost test3]# diff log2014.log log2013.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2014-03               | 2013-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-07               | 2013-08
    2013-09                 2013-09
    2013-10                 2013-10
    2013-11               <
    2013-12               <
     
    [root@localhost test3]# diff log2013.log log2014.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2013-03               | 2014-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-08               | 2013-07
    2013-09                 2013-09
    2013-10                 2013-10
                          > 2013-11
                          > 2013-12
    说明:

    “|”表示前后2个文件内容有不同

    “<”表示后面文件比前面文件少了1行内容

    “>”表示后面文件比前面文件多了1行内容


     
     
    上下文输出格式
    [root@localhost test3]# diff log2013.log log2014.log  -c
    *** log2013.log 2012-12-07 16:36:26.000000000 +0800
    --- log2014.log 2012-12-07 18:01:54.000000000 +0800
    ***************
    *** 1,10 ****
      2013-01
      2013-02
    ! 2013-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-08
      2013-09
      2013-10
    --- 1,12 ----
      2013-01
      2013-02
    ! 2014-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-07
      2013-09
      2013-10
    + 2013-11
    + 2013-12
     
    [root@localhost test3]# diff log2014.log log2013.log  -c
    *** log2014.log 2012-12-07 18:01:54.000000000 +0800
    --- log2013.log 2012-12-07 16:36:26.000000000 +0800
    ***************
    *** 1,12 ****
      2013-01
      2013-02
    ! 2014-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-07
      2013-09
      2013-10
    - 2013-11
    - 2013-12
    --- 1,10 ----
      2013-01
      2013-02
    ! 2013-03
      2013-04
      2013-05
      2013-06
      2013-07
    ! 2013-08
      2013-09
      2013-10
    [root@localhost test3]#
    这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:

    “+” 比较的文件的后者比前着多一行

    “-” 比较的文件的后者比前着少一行

    “!” 比较的文件两者有差别的行
     
     
     
    统一格式输出
    [root@localhost test3]# diff log2014.log log2013.log  -u
    --- log2014.log 2012-12-07 18:01:54.000000000 +0800
    +++ log2013.log 2012-12-07 16:36:26.000000000 +0800
    @@ -1,12 +1,10 @@
     2013-01
     2013-02
    -2014-03
    +2013-03
     2013-04
     2013-05
     2013-06
     2013-07
    -2013-07
    +2013-08
     2013-09
     2013-10
    -2013-11
    -2013-12
     
    第一部分,也是文件的基本信息:

    --- log2014.log 2012-12-07 18:01:54.000000000 +0800

    +++ log2013.log 2012-12-07 16:36:26.000000000 +0800

    "---"表示变动前的文件,"+++"表示变动后的文件。


    第二部分,变动的位置用两个@作为起首和结束

    @@ -1,12  +1,10 @@

    前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。意思:第一个文件从第1行开始的连续12行。

    同样的,"+1,10" 表示第二个文件从第1行开始的连续10行。

    比较文件夹

    [root@localhost test]# diff test3 test6
    Only in test6: linklog.log
    Only in test6: log2012.log
     
    [root@localhost test]# diff test3/log2013.log test6/log2013.log
    1,10c1,3
    < 2013-01
    < 2013-02
    < 2013-03
    < 2013-04
    < 2013-05
    < 2013-06
    < 2013-07
    < 2013-08
    < 2013-09
    < 2013-10
    ---
    > hostnamebaidu=baidu.com
    > hostnamesina=sina.com
    > hostnames=true
     
    [root@localhost test]# diff test3/log2014.log test6/log2014.log
    1,12d0
    < 2013-01
    < 2013-02
    < 2014-03
    < 2013-04
    < 2013-05
    < 2013-06
    < 2013-07
    < 2013-07
    < 2013-09
    < 2013-10
    < 2013-11
    < 2013-12
    Only in test6: log2015.log
    Only in test6: log2016.log
    Only in test6: log2017.log
    [root@localhost test]#
     

    比较两个文件不同,并生产补丁

    [root@localhost test3]# diff -ruN log2013.log log2014.log >patch.log
    [root@localhost test3]# ll
    总计 12
    -rw-r--r-- 2 root root  80 12-07 16:36 log2013.log
    -rw-r--r-- 1 root root  96 12-07 18:01 log2014.log
    -rw-r--r-- 1 root root 248 12-07 21:33 patch.log
     
    [root@localhost test3]# cat patch.log
    --- log2013.log 2012-12-07 16:36:26.000000000 +0800
    +++ log2014.log 2012-12-07 18:01:54.000000000 +0800
    @@ -1,10 +1,12 @@
     2013-01
     2013-02
    -2013-03
    +2014-03
     2013-04
     2013-05
     2013-06
     2013-07
    -2013-08
    +2013-07
     2013-09
     2013-10
    +2013-11
    +2013-12
    [root@localhost test3]#
     

    打补丁

    [root@localhost test3]# cat log2013.log
    2013-01
    2013-02
    2013-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-08
    2013-09
    2013-10
     
    [root@localhost test3]# patch log2013.log patch.log  使用上面产生的patch.log文件打补丁
    patching file log2013.log
     
    [root@localhost test3]# cat log2013.log
    2013-01
    2013-02
    2014-03
    2013-04
    2013-05
    2013-06
    2013-07
    2013-07
    2013-09
    2013-10
    2013-11
    2013-12
    [root@localhost test3]#
     

    实例

    实例:有这样两个文件。程序清单1,程序清单2
    程序清单1 :hello.c
    #include
    int main(void)
    {
        char msg[] = "Hello world!";
       
        puts(msg);
        printf("Welcome to use diff commond.n");
       
        return 0; 
    }
     
    程序清单2:hello_diff.c
    #include
    #include 
    int main(void)
    {
        char msg[] = "Hello world,fome hello_diff.c";
       
        puts(msg);
        printf("hello_diff.c says,'Here you are,using diff.'n");
       
        return 0;
    }
     
     
    我们使用diff命令来查看这两个文件的不同之处,有一下几种方便的方法:

    1、普通格式输出:
    [root@localhost diff]# diff hello.c hello_diff.c
    1a2
    > #include
    5c6
           char msg[] = "Hello world,fome hello_diff.c";
    8c9
           printf("hello_diff.c says,'Here you are,using diff.'n");
    [root@localhost diff]#
    上面的“1a2”表示后面的一个文件"hello_diff.c"比前面的一个文件"hello.c"多了一行
    "5c6"表示第一个文件的第5行与第二个文件的第6行有区别
     
     
    2、并排格式输出
    [root@localhost diff]# diff hello.c hello_diff.c -y -W 130  -W选择可以指定输出列的宽度,这里指定输出列宽为130
    #include                                                      #include
                                                                  > #include
    int main(void)                                                  int main(void)
    {                                                               {
            char msg[] = "Hello world!";                          |         char msg[] = "Hello world,fome hello_diff.c";
            puts(msg);                                                      puts(msg);
            printf("Welcome to use diff commond.n");             |         printf("hello_diff.c says,'Here you are,using diff.'
            return 0;                                                       return 0;
    }                                                               }
    [root@localhost diff]#
    这种并排格式的对比一目了然,可以快速找到不同的地方。
     
     
    3、上下文输出格式
    [root@localhost diff]# diff hello.c hello_diff.c -c
    *** hello.c     2007-09-25 17:54:51.000000000 +0800
    --- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    ***************
    *** 1,11 ****
      #include 
     
      int main(void)
      {
    !       char msg[] = "Hello world!";
     
            puts(msg);
    !       printf("Welcome to use diff commond.n");
     
            return 0;
      }
    --- 1,12 ----
      #include
    + #include
     
      int main(void)
      {
    !       char msg[] = "Hello world,fome hello_diff.c";
     
            puts(msg);
    !       printf("hello_diff.c says,'Here you are,using diff.'n");
     
            return 0;
      }
    [root@localhost diff]#
    这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:

    +        比较的文件的后者比前着多一行

    -        比较的文件的后者比前着少一行

    !        比较的文件两者有差别的行
     
     
     
    4、统一输出格式
    [root@localhost diff]# diff hello.c hello_diff.c -u
    --- hello.c     2007-09-25 17:54:51.000000000 +0800
    +++ hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    @@ -1,11 +1,12 @@
    #include
    +#include
     
    int main(void)
    {
    -       char msg[] = "Hello world!";
    +       char msg[] = "Hello world,fome hello_diff.c";
     
            puts(msg);
    -       printf("Welcome to use diff commond.n");
    +       printf("hello_diff.c says,'Here you are,using diff.'n");
     
            return 0;
    }
    [root@localhost diff]#
     
     
     
    5、其他 
    [root@localhost diff]# diff hello.c hello_diff.c -q  假如你想查看两个文件是否不同又不想显示差异之处的话,可以加上-q选项
    Files hello.c and hello_diff.c differ
    [root@localhost diff]#
    [root@localhost diff]# diff hello.c hello_diff.c -c -I include  这里通过“ -I include”选项来忽略带有“ include”字样的行。另外你还可以提供一些匹配规则来忽略某中差别,可以用 -I regexp
    *** hello.c     2007-09-25 17:54:51.000000000 +0800
    --- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    ***************
    *** 2,11 ****
     
      int main(void)
      {
    !       char msg[] = "Hello world!";
     
            puts(msg);
    !       printf("Welcome to use diff commond.n");
     
            return 0;
      }
    --- 3,12 ----
      
      int main(void)
      {
    !       char msg[] = "Hello world,fome hello_diff.c";
     
            puts(msg);
    !       printf("hello_diff.c says,'Here you are,using diff.'n");
     
            return 0;
      }
    [root@localhost diff]#

  • 相关阅读:
    CompletableFuture java 8新增加异步处理
    Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore , Condition
    怎么让一个不定宽高的div垂直水平居中?
    数组对象方法排序
    Webpack ERROR in Path must be a string. Received undefined
    es6 babel转码器安装配置及常见命令
    使用淘宝镜像cnpm安装Vue.js
    JS中的call()和apply()方法
    placeholder颜色更改
    typeof与js数据类型
  • 原文地址:https://www.cnblogs.com/datapool/p/6213319.html
Copyright © 2011-2022 走看看