当前位置: 移动技术网 > 网络运营>服务器>Linux > 一天一个shell命令 linux文本操作系列-diff命令详解

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

2017年12月12日  | 移动技术网网络运营  | 我要评论

这又是一个文件比较命令,熟练掌握会节省你很多工作。还记得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 表示有错误产生。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网