0%

Linux diff命令

Linux diff 命令

Linux diff 命令用于比较文件的差异。

当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机即用的。

官方定义为:

GNU diff - compare files line by line

diff 会以逐行的方式,比较文本文件的不同。

如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

语法

1
$ diff [OPTION]... FILES

参数

  • -c 显示所有内容,并标出不同之处。
  • -u 以合并的方式来显示文件内容的不同。
  • -y--side-by-side  两列输出显示文件的异同之处。

假定有两个文件ab,内容分别为:

1
2
3
4
5
6
7
8
9
$ cat a
This is a.
Hello a.
Hello World.

$ cat b
This is b.
Hello b.
Hello World.

默认比较两个文件

默认情况下,直接输入下面命令即可:

1
2
3
4
5
6
7
8
9
$  diff a b
1,2c1,2
< This is a.
< Hello a.
---
> This is b.
> Hello b.
3a4
> One more line.

可以看到1,2c1,2,中间有一个字母c3a4,中间有一个字母a

那么ac什么含义呢,中间的字母表示需要在第一个文件上做的操作(a=add,c=change,d=delete),然后才有后面的文件一致。

所以1,2c1,2表示1,2行更换后一致;3a4表示,增加一行后一致。

并排显示方便比较

这种方式相对而言,就很亲民了,左右两边两列方便比对。

1
2
3
4
5
$ diff a b -y
This is a. | This is b.
Hello a. | Hello b.
Hello World. Hello World.
> One more line.

那么:

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

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

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

context模式比较

这种模式会输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下*** 表示a的内容,--- 表示b的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ diff a b -c
*** a 2013-03-04 20:30:20.322345200 +0800
+++ b 2013-03-04 20:26:30.712130000 +0800
***************
*** 1,3 ****
! This is a.
! Hello a.
Hello World.
--- 1,4 ----
! This is b.
! Hello b.
Hello World.
+ One more line.

unified模式比较

这种模式会混合输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下--- 表示a的内容,+++ 表示b的内容。

1
2
3
4
5
6
7
8
9
10
$  diff a b -u
--- a 2013-03-04 20:30:20.322345200 +0800
+++ b 2013-03-04 20:26:30.712130000 +0800
@@ -1,3 +1,4 @@
-This is a.
-Hello a.
+This is b.
+Hello b.
Hello World.
+One more line.
  • -<行数>  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。

  • -a或–text  diff预设只会逐行比较文本文件。

  • -b或–ignore-space-change  不检查空格字符的不同。

  • -B或–ignore-blank-lines  不检查空白行。

  • -C<行数>或–context<行数>  与执行”-c-<行数>”指令相同。

  • -d或–minimal  使用不同的演算法,以较小的单位来做比较。

  • -D<巨集名称>或ifdef<巨集名称>  此参数的输出格式可用于前置处理器巨集。

  • -e或–ed  此参数的输出格式可用于ed的script文件。

  • -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。

  • -H或–speed-large-files  比较大文件时,可加快速度。

  • -I<字符或字符串>或–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类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。

  • -r或–recursive  比较子目录中的文件。

  • -s或–report-identical-files  若没有发现任何差异,仍然显示信息。

  • -S<文件>或–starting-file<文件>  在比较目录时,从指定的文件开始比较。

  • -t或–expand-tabs  在输出时,将tab字符展开。

  • -T或–initial-tab  在每行前面加上tab字符以便对齐。

  • -w或–ignore-all-space  忽略全部的空格字符。

  • -W<宽度>或–width<宽度>  在使用-y参数时,指定栏宽。

  • -x<文件名或目录>或–exclude<文件名或目录>  不比较选项中所指定的文件或目录。

  • -X<文件>或–exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。

  • –left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。

  • –suppress-common-lines  在使用-y参数时,仅显示不同之处。

     Mandatory arguments to long options are mandatory for short options too.
    
     --normal
            output a normal diff (the default)
    
     -q, --brief
            report only when files differ
    
     -s, --report-identical-files
            report when two files are the same
    
     -c, -C NUM, --context[=NUM]
            output NUM (default 3) lines of copied context
    
     -e, --ed
            output an ed script
    
     -n, --rcs
            output an RCS format diff
    
     -W, --width=NUM
            output at most NUM (default 130) print columns
    
     --left-column
            output only the left column of common lines
    
     --suppress-common-lines
            do not output common lines
    
     -p, --show-c-function
            show which C function each change is in
             -F, --show-function-line=RE
                show the most recent line matching RE
    
         --label LABEL
                use LABEL instead of file name and timestamp (can be repeated)
    
         -t, --expand-tabs
                expand tabs to spaces in output
    
         -T, --initial-tab
                make tabs line up by prepending a tab
    
         --tabsize=NUM
                tab stops every NUM (default 8) print columns
    
         --suppress-blank-empty
                suppress space or tab before empty output lines
    
         -l, --paginate
                pass output through 'pr' to paginate it
    
         -r, --recursive
                recursively compare any subdirectories found
    
         --no-dereference
                don't follow symbolic links
    
         -N, --new-file
                treat absent files as empty
    
         --unidirectional-new-file
                treat absent first files as empty
    
         --ignore-file-name-case
                ignore case when comparing file names
    
         --no-ignore-file-name-case
                consider case when comparing file names
    
         -x, --exclude=PAT
                exclude files that match PAT
    
         -X, --exclude-from=FILE
                exclude files that match any pattern in FILE
    
         -S, --starting-file=FILE
                start with FILE when comparing directories
                
                 --from-file=FILE1
                compare FILE1 to all operands; FILE1 can be a directory
    
         --to-file=FILE2
                compare all operands to FILE2; FILE2 can be a directory
    
         -i, --ignore-case
                ignore case differences in file contents
    
         -E, --ignore-tab-expansion
                ignore changes due to tab expansion
    
         -Z, --ignore-trailing-space
                ignore white space at line end
    
         -b, --ignore-space-change
                ignore changes in the amount of white space
    
         -w, --ignore-all-space
                ignore all white space
    
         -B, --ignore-blank-lines
                ignore changes where lines are all blank
    
         -I, --ignore-matching-lines=RE
                ignore changes where all lines match RE
    
         -a, --text
                treat all files as text
    
         --strip-trailing-cr
                strip trailing carriage return on input
    
         -D, --ifdef=NAME
                output merged file with '#ifdef NAME' diffs
    
         --GTYPE-group-format=GFMT
                format GTYPE input groups with GFMT
    
         --line-format=LFMT
                format all input lines with LFMT
                
                      These format options provide fine-grained control over the output
    
                of diff, generalizing -D/--ifdef.
    
         LTYPE is 'old', 'new', or 'unchanged'.
                GTYPE is LTYPE or 'changed'.
    
                GFMT (only) may contain:
    
         %<     lines from FILE1
    
         %>     lines from FILE2
    
         %=     lines common to FILE1 and FILE2
    
         %[-][WIDTH][.[PREC]]{doxX}LETTER
                printf-style spec for LETTER
    
                LETTERs are as follows for new group, lower case for old group:
    
         F      first line number
    
         L      last line number
    
         N      number of lines = L-F+1
    
         E      F-1
    
         M      L+1
    
         %(A=B?T:E)
                if A equals B then T else E
    
                LFMT (only) may contain:
    
         %L     contents of line
    
         %l     contents of line, excluding any trailing newline
    
         %[-][WIDTH][.[PREC]]{doxX}n
                printf-style spec for input line number
    
                Both GFMT and LFMT may contain:
    
         %%     %
         
          %c'C'  the single character C
    
         %c'\OOO'
                the character with octal code OOO
    
         C      the character C (other characters represent themselves)
    
         -d, --minimal
                try hard to find a smaller set of changes
    
         --horizon-lines=NUM
                keep NUM lines of the common prefix and suffix
    
         --speed-large-files
                assume large files and many scattered small changes
    
         --color[=WHEN]
                colorize the output; WHEN can be 'never', 'always', or 'auto' (the default)
    
         --palette=PALETTE
                the colors to use when --color is active; PALETTE is a colon-separated list of terminfo capabilities
    
    
    
         FILES  are  'FILE1  FILE2'  or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'.  If --from-file or --to-file is given,
         there are no restrictions on FILE(s).  If a FILE is '-', read standard input.  Exit status is 0 if inputs  are
         the same, 1 if different, 2 if trouble.
    
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道