檔案比較與修正 diff and patch
[lcc09@localhost ~]$ diff --help
用法:diff [選項]... FILES
比較兩個檔案的每一行。
-i --ignore-case 不分辨檔案內容中的大小寫。
-E --ignore-tab-expansion 忽略因將 tab 轉換為空格而造成的差異。
-b --ignore-space-change 忽略因空白字元數目不同而造成的差異。
-w --ignore-all-space 忽略所有空白字元。
-B --ignore-blank-lines 忽略任何因空行而造成的差異。
-I RE --ignore-matching-lines=RE 忽略任何符合指定的<正規表示式>的地方。
--strip-trailing-cr 去除輸入資料每行末端的 carriage return 字元。
-a --text 所有檔案都以文字檔方式處理。
-c -C 行數 --context[=行數] 顯示指定<行數>(預設 3 行)copied 格式的上下文
-u -U 行數 --unified[=行數] 顯示指定<行數>(預設 3 行)unified 格式的上下文
-q --brief 只顯示檔案是否不同。
-e --ed 以 ed script 方式輸出。
--normal 以正常的 diff 方式輸出。
-n --rcs 以 RCS diff 格式輸出。
-y --side-by-side 以兩列並排的方式顯示。
-D NAME --ifdef=NAME 輸出的資料以‘#ifdef NAME’方式標明差異。
-l --paginate 將輸出送至‘pr’指令來分頁。
-t --expand-tabs 將輸出中的 tab 換成空格。
-T --initial-tab 每行先加上 tab 字元,使 tab 字元可以對齊。
-r --recursive 連同所有副目錄一起比較。
-N --new-file 不存在的檔案以空白檔案方式處理。
--unidirectional-new-file 若第一個檔案不存在,以空白檔案處理。
-s --report-identical-files 當兩個檔案一樣時仍然顯示結果。
-x PAT --exclude=PAT 排除樣式為 PAT 的檔案。
-X FILE --exclude-from=FILE 排除所有在 FILE 中列出的樣式的檔案。
-S FILE --starting-file=FILE 當比較目錄時,由 FILE 開始比較。
...(略)...
- patch 由 diff 所產生的patch file 來修正原始檔案的不同
- 練習之前先建立兩個sample檔案
- 檔名:diff_test.php 測試原始檔
[lcc09@localhost ~]$ vi diff_test.php
");
echo ("");
echo ("\$ Dollar sign \\\$
");
echo ("\\ Backslash \\\\ in double quotes
");
echo ('\' Single quote \\\'
');
echo ('\\ Backslash \\\\ in single quotes
');
echo ("\x41 ASCII code \\x41
");
echo ("\141 ASCII code \\141
");
?>
- 檔名:diff_test_err.php 測試修正檔
[lcc09@localhost ~]$ vi diff_test_err.php
");
echo ("");
echo ("\$ Dollar sign \\\$
");
echo ("\\ Backslash \\\\ in double quotes
");
echo ('\' Single quote \\\'
');
echo ('\\ Backslash \\\\ in single quotes
');
echo ("\x41 ASCII code \\x41
");
echo ("\141 ASCII code \\141
");
?>
- 這裏的-u是顯示出上下三行共通的程式碼以方便開發人員找出更新的地方。
[lcc09@localhost ~]$ diff -u diff_test_err.php diff_test.php
--- diff_test_err.php 2007-05-30 21:49:15.000000000 +0800
+++ diff_test.php 2007-05-30 21:48:19.000000000 +0800
@@ -4,9 +4,9 @@
echo ("$cat *** " . '$dog' . "
");
echo ("");
echo ("\$ Dollar sign \\\$
");
- echo ("\\ Backslash \\\\ in double quotes
");
+ echo ("\\ Backslash \\\\ in double quotes
");
echo ('\' Single quote \\\'
');
- echo ('\\ Backslash \\\\ in single quotes
');
+ echo ('\\ Backslash \\\\ in single quotes
');
echo ("\x41 ASCII code \\x41
");
echo ("\141 ASCII code \\141
");
?>
[lcc09@localhost ~]$ diff -u diff_test_err.php diff_test.php > diff_test.php.patch
[lcc09@localhost ~]$ patch --help
Usage: patch [OPTION]... [ORIGFILE [PATCHFILE]]
...(略)...
Backup and version control options:
-b --backup Back up the original contents of each file.
--backup-if-mismatch Back up if the patch does not match exactly.
--no-backup-if-mismatch Back up mismatches only if otherwise requested.
...(略)...
- 使用patch指令修正異動的地方,修正的方式參考diff_test.php.patch的檔案說明。這裡的-b是指在修正前要先備份備份附檔名為.orig。
[lcc09@localhost ~]$ patch -b diff_test_err.php diff_test.php.patch
patching file diff_test_err.php
[lcc09@localhost ~]$ cat diff_test_err.php
");
echo ("");
echo ("\$ Dollar sign \\\$
");
echo ("\\ Backslash \\\\ in double quotes
");
echo ('\' Single quote \\\'
');
echo ('\\ Backslash \\\\ in single quotes
');
echo ("\x41 ASCII code \\x41
");
echo ("\141 ASCII code \\141
");
?>
沒有留言:
張貼留言