欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-08-26 16:29:35
这又是一个文件比较命令,熟练掌握会节省你很多工作。还记得comm命令吗?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
 < v1_echo
 ---
 > hello world!
 > v2_echo
 4c4
 < v1_comm
 ---
 > easy shell!

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

2.一体化输出:

$diff -u v1.txt v2.txt > 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< 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 表示有错误产生。