一天一个shell命令 linux文本操作系列-diff命令详解

这又是一个文件比较命令,熟练掌握会节省你很多工作。还记得comm命令吗?diff比他更加复杂,好用,不仅能比较文件,还能比较目录。 当一个文件有多个版本时候,或者更多复杂的文件,目录比较时,你会期望有一个比comm更有用的命令,diff正是为此而生。

全称:different file

实例:

文件1: v1.txt


hello

  world v1_echo 

  v1_diff

  v1_comm 

 shell is easy!

文件2: v2.txt


hello world! 

v2_echo

 v1_diff

 easy shell! 

1.普通比较:
$diff v1.txt v2.txt


1,2c1,2 

 < hello world 

 &lt; v1_echo 

 --- 

 > hello world! 

 &gt; v2_echo 

 4c4 

 < v1_comm 

 --- 

 > easy shell!



列出比较的区别,数字为行数,c是compare

2.一体化输出:

$diff -u v1.txt v2.txt &gt; version.patch


-v1_echo 

 +hello world! 

 +v2_echo 

 v1_diff 

 -v1_comm 

 +easy shell! 

 shell is easy!



"+"表示补充的行,"-"表示删去的行

3. 更新覆盖v1.txt,注意这里借用了patch

$patch –p1 v1.txt&lt; version.patch

4. 比较v1,v2文件,仅输出v2的变化

$diff -e v1.txt v2.txt


 4c 

 easy shell! 

 . 

 1,2c 

 hello world! 

 v2_echo 

 .

5.比较目录

借用书上一段解释:

-N 将所有确实的文件视为空文件
-a 将所有文件市委文件文本
-u 生成一体化输出
-r 遍历目录下的所有文件

比较两个目录下所有文本信息

$diff –Naur directory1 directory2

除非你确定这两个目录基本相同,不然不推荐这么用。

6.工作疲劳后,尤其同时做很多事情的时候,会忘了有没有做过上传,或者修改某个目录下的文件。可以这样:

$diff v1.txt /${dir}

直接比较同名文件,高强度下的工作者相信真有体会。

解读下—help

太长,截取少部分解读一下。


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 

 -u, -U NUM, --unified[=NUM]     output NUM (default 3) lines of unified context 

 -e, --ed                                          output an ed script 

 -n, --rcs                                         output an RCS format diff 

 -y, --side-by-side                           output in two columns 



FILES 的格式可以是‘FILE1 FILE2'、‘DIR1 DIR2'、‘DIR FILE...'或 

‘FILE... DIR'。 



解读:

1.-q –s

-q: 只有两个不同是,提示“两个文件不同”

-s: 两个文件相同时,提示“两个文件相同”

$diff -qs v1.txt v2.txt

(有点无聊的命令 )

2. –y

按照列的方式输出,增加了直观性


 hello world               | hello world! 

 v1_echo                    | v2_echo 

 v1_diff                       v1_diff 

 v1_comm                   | easy shell! 

 shell is easy!               shell is easy! 



3. file 后面的格式

可以是1.文件 文件 2.目录与目录 3.文件与目录 4. 目录与文件
解释一下,文件与目录的形式,比较的是该目录下 与 比较文件同名的文件比较
如:$ diff v1.txt diff/
则实际是v1.txt 与 diff/v1.txt的比较。这是个很常用的功能。

对比comm
就比较文件而言,comm功能比较简单,但是也很直观,方便
而diff 提供了更强大,更复杂的比较方式,还能对比目录,遍历目录。


用法:diff [选项]... FILES

Compare FILES line by line.



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

  -u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context

  -e, --ed                      output an ed script

  -n, --rcs                     output an RCS format diff

  -y, --side-by-side            output in two columns

  -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

                                  (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

  -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 whose lines are all blank

  -I, --ignore-matching-lines=RE  ignore changes whose lines all 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

      --LTYPE-line-format=LFMT    format LTYPE input lines with LFMT

    These format options provide fine-grained control over the output

      of diff, generalizing -D/--ifdef.

    LTYPE 可以是‘old'、‘new'或‘unchanged'。GTYPE 可以是 LTYPE 的选择

    或是‘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



      --help               display this help and exit

  -v, --version            output version information and exit



  FILES 的格式可以是‘FILE1 FILE2'、‘DIR1 DIR2'、‘DIR FILE...'或

      ‘FILE... DIR'。

If --from-file or --to-file is given, there are no restrictions on FILE(s).

如果 FILE 是‘-',则由标准输入读取内容。

如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。

猜你喜欢