通常一个软件包的不同版本之间,比较配置文件与原始档的差异时,经常用到一些文件比对的工具。这里就讲一下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的参数很多,以后用到了再详细列出来吧~