這又是一個(gè)文件比較命令,熟練掌握會(huì)節(jié)省你很多工作。還記得comm命令嗎?diff比他更加復(fù)雜,好用,不僅能比較文件,還能比較目錄。 當(dāng)一個(gè)文件有多個(gè)版本時(shí)候,或者更多復(fù)雜的文件,目錄比較時(shí),你會(huì)期望有一個(gè)比comm更有用的命令,diff正是為此而生。
全稱:different file
實(shí)例:
文件1: v1.txt
復(fù)制代碼 代碼如下:
hello
world v1_echo
v1_diff
v1_comm
shell is easy!
文件2: v2.txt
復(fù)制代碼 代碼如下:
hello world!
v2_echo
v1_diff
easy shell!
1.普通比較:
$diff v1.txt v2.txt
復(fù)制代碼 代碼如下:
1,2c1,2
hello world
lt; v1_echo
---
> hello world!
gt; v2_echo
4c4
v1_comm
---
> easy shell!
列出比較的區(qū)別,數(shù)字為行數(shù),c是compare
2.一體化輸出:
$diff -u v1.txt v2.txt gt; version.patch
復(fù)制代碼 代碼如下:
-v1_echo
+hello world!
+v2_echo
v1_diff
-v1_comm
+easy shell!
shell is easy!
"+"表示補(bǔ)充的行,"-"表示刪去的行
3. 更新覆蓋v1.txt,注意這里借用了patch
$patch –p1 v1.txtlt; version.patch
4. 比較v1,v2文件,僅輸出v2的變化
$diff -e v1.txt v2.txt
復(fù)制代碼 代碼如下:
4c
easy shell!
.
1,2c
hello world!
v2_echo
.
5.比較目錄
借用書上一段解釋:
-N 將所有確實(shí)的文件視為空文件
-a 將所有文件市委文件文本
-u 生成一體化輸出
-r 遍歷目錄下的所有文件
比較兩個(gè)目錄下所有文本信息
$diff –Naur directory1 directory2
除非你確定這兩個(gè)目錄基本相同,不然不推薦這么用。
6.工作疲勞后,尤其同時(shí)做很多事情的時(shí)候,會(huì)忘了有沒有做過上傳,或者修改某個(gè)目錄下的文件??梢赃@樣:
$diff v1.txt /${dir}
直接比較同名文件,高強(qiáng)度下的工作者相信真有體會(huì)。
解讀下—help
太長,截取少部分解讀一下。
復(fù)制代碼 代碼如下:
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: 只有兩個(gè)不同是,提示“兩個(gè)文件不同”
-s: 兩個(gè)文件相同時(shí),提示“兩個(gè)文件相同”
$diff -qs v1.txt v2.txt
(有點(diǎn)無聊的命令 )
2. –y
按照列的方式輸出,增加了直觀性
復(fù)制代碼 代碼如下:
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/
則實(shí)際是v1.txt 與 diff/v1.txt的比較。這是個(gè)很常用的功能。
對(duì)比comm
就比較文件而言,comm功能比較簡(jiǎn)單,但是也很直觀,方便
而diff 提供了更強(qiáng)大,更復(fù)雜的比較方式,還能對(duì)比目錄,遍歷目錄。
復(fù)制代碼 代碼如下:
用法:diff [選項(xiàng)]... 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 是‘-',則由標(biāo)準(zhǔn)輸入讀取內(nèi)容。
如果輸入相同,則退出狀態(tài)為 0;1 表示輸入不同;2 表示有錯(cuò)誤產(chǎn)生。