2012/08/30

檔案比較與修正 diff and patch


檔案比較與修正 diff and patch

  • diff 比較檔案的異同
[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
");
?>
  • diff比較範例
  1. 這裏的-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
  • 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
");
?>
張貼留言