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