一天一個shell命令 linux文本操作系列-diff命令詳解_linux shell

來源:互聯網
上載者:User

這又是一個檔案比較命令,熟練掌握會節省你很多工作。還記得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 表示有錯誤產生。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.