通常一个软件包的不同版本之间,比较配置文件与原始档的差异时,经常用到一些文件比对的工具。这里就讲一下diff和cmp。
1. 以行为单位对比的diff
由于是以行为比对的单位,因此diff常常是用在同一文件(或软件)的新旧版本差异上。
工作模式:diff [-bBi] file1 file2
选项与参数
-- file1 :作为原始比对文件的文档名
-- file2 :作为目的比对文件的文档名
注意,file1 或 file2可以被-取代(-代表 Standrd input 之意)
-- b:忽略一行当中,仅有空格数目的差异
-- B :忽略空白行的差异
-- i :忽略大小写的不同
diff的应用实例:
这里首先需要创造出file1 (hello.c) 和 file2 (hello.new):
(1)hello.c文件
hello.c
(2)hello.new文件
通过指令cat hello.c | sed -e '2d' -e '5c no fifth line' > hello.new(翻译成人话:将hello.c的第2行删掉,第5行改成'no fifth line'输出到hello.new文件)
需要注意⚠️:sed后面如果要接超过两个以上的动作时,每个动作前面都要加e才行
hello.new
(3)使用diff来比较
diff hello.c hello.new
比较hello.c 和 hello.new的差异
解释一下diff处理后输出数据的含义:
2d1 ## file1的第2行被删除;基准是file2的第1行
< main() ## 列出了file1被删除那行的内容
5c4 ## file1的第5行被取代成file2的第4行
< } ## file1第5行内容
---
> no fifth line ##file2第4行内容
2.利用字节单位对比的cmp
cmp主要也是在比对两个文件,但它主要利用 字节单位 去比对。
工作模式:cmp [-l] file1 file2
-- 选项与参数
-l :将所有的不同点的字节处都列出来(cmp预设仅会输出第一个发现的不同点)
cmp hello.c hello.new
不同点太多,cmp -l hello.c hello.new只截取部分
cmp -l hello.c hello.new
3.利用patch进行文件升级
patch这个指令与diff有密不可分的关系。我们前面提到,diff可以用来分辨两个版本之间的差异,举例来说,hello.c 及 hello.new 之间就是两个不同版本。如何将旧的文件升级为新的文件?
我们可以通过diff先比较新旧版本的差异,将差异文档制作成补丁文档,再由补丁文档更新旧文件即可~(还是拿hello.c和hello.new测试)
3.1 制作补丁文档
指令行中输入 diff -Naur hello.c hello.new > hello.patch
运行后我们可以获得补丁文档hello.patch
补丁文档 hello.patch
工作原理:新文件看到-会删除,看到+会加入
3.2 使用patch更新文本
更新模式 patch -pN < patch_file
还原模式 patch -R -pN < patch_file
-p:后面可以接“取消几层目录”(eg:新旧文本在同一目录用p0)
-R:代表还原,将新的文件还原成原来旧的版本
我们要更新hello.c,便在指令行中输入 patch -p0 < hello.patch,随即便获得了更新后的hello.c。此时再对比一下hello.c 和 hello.new,会发现两者一摸一样。
倘若我要恢复hello.c为旧版本呢?
patch -R -p0 < hello.patch 就可以了
4.文件打印准备 pr
还记得,我们平时使用windows打印文本时,可以同时选择与设定每一页打印时的标头和页码吗?事实上,我们在linux底下打印纯文本文档其实也是可以加入标题和页码的。
直接 pr filename就可以,pr的参数很多,以后用到了再详细列出来吧~