参考资料:
diff命令①《精通Linux》p17,p279–p280
②《快乐的 Linux 命令行》http://billie66.github.io/TLCL/ p291–p295
③《鸟哥的Linux私房菜,基础3版》p366–p368
主要用于比较文件或者目录之间的差异,配合patch命令可以实现不同程序源码版本之间的更改。通常情况下的一个用例是diff程序创建一个diff文件或patch补丁文件,然后patch使用该文件对源码进行更新
diff比较命令有不同的输出风格,这里记录最为常用的统一模式风格,也即使用 -u选项
假设有两个有差异的文件file1.txt和file2.txt,如下所示:
调用diff命令进行比较,输出风格为统一模式
diff -u file1.txt file2.txt #输出如下所示:
- 前两行为文件名和时间戳组成的开头,第一个文件用---做标记,第二个文件用+++做标记第三行的@@ -1,4 +1,4 @@描述了第一个文件的差异存在范围是第1行到第4行,第二个文件的差异存在范围是第1行到第4行,-表示第一个文件,+表示第二个文件第三行之后的字符串是文本行本身,以三种字符开头,代表不同的涵义
空格表示两个文件均含有改行;-表示从一个文件更新为第二个文件时需要删除改行;+表示从第一个更新为第二个文件时需要添加改行 注意:该补丁文件已经包含了所有的更新/修改策略,所以更新的时候只要能找到该文件就可以进行更新
另外:diff可以工作于任何文本文件,源码、配置文件等等
使用diff命令生成区别文件或补丁文件
diff -Naur old_file new_file > diff_file #其中old_file和new_file既可以是文件也可以是目录 -N 表示如果是比较目录,若文件A仅出现在某目录中,预设显示为only in..... -u 表示使用统一模式输出,也即前文所述的模式 -r 表示递归比较子目录 -a 表示逐行比较文本文件
例如:
diff -Naur file1.txt file2.txt > file.patch
接下来就可以利用patch命令和file.patch补丁文件进行更新
patch命令
#更新 patch -pN < patch_file #还原 patch -R -pN < patch_file -p 表示忽略N层目录(这个地方有点不好理解,后面会说) -R 表示将新的文件还原成旧的版本
接着上文:更新file1.txt到file2.txt
#先键入到同时包含file1.txt和file2.txt的目录下,然后再执行命令 patch < file.patch #我们没有必要再去指定要更新/修补的目标文件,因为diff文件/file.patch文件中已经在标题行包含了文件名
或者如下命令更新:
-p参数主要用于目录相关的地方,假设有一个补丁文件开头如下所示:
情况1:若当前位于src目录下,则可直接执行如下命令进行更新:
patch -p0 < file.patch 或 patch < file.patch
情况2:若补丁开头与当前环境不同,则可以使用-p适当忽略几层目录
也即若你当前所在的目录为package-3.45,其下有src目录,针对上图的补丁文件,需要忽略第一层的目录
patch -p1 < file.patch #其中file.patch 也可以使用绝对路径定位到该文件
如果是源码更新完之后,就可以重新编译构建、安装了
make clean main #先清理目标文件,然后构建 make install #安装



