diff
diff 就是用在比对两个档案之间的差异的,一般是用在 ASCII 纯文字文件的比对上。 我们先预处理一下一个档案好了。假设我要将 /etc/passwd 的内容,将第四行删除, 第六行则取代成为『no six line』,新的档案放置到 /tmp/test 里面, 那么应该怎么做?
[root@linux ~]# mkdir -p /tmp/test
[root@linux ~]# cat /etc/passwd | \
> sed -e '4d' -e '6c no six line' > /tmp/test/passwd
# 注意一下, sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行!
接下来讨论一下关于 diff 的用法吧!
[root@linux ~]# diff [-bBi] from-file to-file
参数:
from-file :一个档名,作为原始比对档案的档名;
to-file :一个档名,作为目的比对档案的档名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。
-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。
范例:
范例一:比对 /tmp/test/passwd 与 /etc/passwd 的差异:
[root@linux ~]# diff /etc/passwd /tmp/test/passwd
4d3 <==这里是说,左边档案(/etc/passwd)第四行被删除 (d)
< adm:x:3:4:adm:/var/adm:/sbin/nologin
6c5 <==这里是说,左边档案的第六行被取代成右边档案(/tmp/test/passwd)的第五行
< sync:x:5:0:sync:/sbin:/bin/sync
---
> no six line
# 很聪明吧!用 diff 就把我们刚刚的处理给比对完毕了!
用 diff 比对档案真的是很简单喔!另外, diff 也可以比对整个目录下的差异喔! 举例来说,我们将两个目录比对一下:
[root@linux ~]# diff /etc /tmp/test
......(前面省略).....
Only in /etc: paper.config
diff /etc/passwd /tmp/test/passwd
4d3
< adm:x:3:4:adm:/var/adm:/sbin/nologin
6c5
< sync:x:5:0:sync:/sbin:/bin/sync
---
> no six line
Only in /etc: passwd-
......(后面省略).....
我们的 diff 很聪明吧!还可以比对不同目录下的相同文件名的内容, 这样真的很方便喔~
--------------------------------------------------------------------------------
cmp
相对于 diff 的广泛用途, cmp 似乎就用的没有这么多了~ cmp 主要也是在比对两个档案,cmp主要利用『位』单位去比对,因此, 当然也可以比对 binary file 啰~(还是要再提醒喔, diff 主要是以『行』为单位比对, cmp 则是以『位』为单位去比对,这并不相同!)
[root@linux ~]# cmp [-s] file1 file2
参数:
-s :将所有的不同点的位处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。
范例:
范例一:用 cmp 比较一下 /etc/passwd 与 /tmp/test/passwd
[root@linux ~]# cmp /etc/passwd /tmp/test/passwd
/etc/passwd /tmp/test/passwd differ: byte 106, line 4
看到了吗?第一个发现的不同点在第四行,而且位数是在第 106 个位处! 这个 cmp 也可以用来比对 binary 啦! ^_^
--------------------------------------------------------------------------------
patch
patch 这个指令与 diff 可是有密不可分的关系啊!我们前面提到, diff 可以用来分辨两个版本之间的差异,举例来说,刚刚我们所建立的 /tmp/test/passwd 与 /etc/passwd 就是两个不同版本之间的档案。那么,如果要『升级』呢? 就是『将旧的档案升级成为新的档案』时,应该要怎么做呢? 举例来说,我们可以这样做测试:
[root@linux ~]# mkdir /tmp/old; cp /etc/passwd /tmp/old
[root@linux ~]# mkdir /tmp/new; cp /tmp/test/passwd /tmp/new
[root@linux ~]# cd /tmp ; diff -Naur old/ new/ > test.patch
diff中选项说明:
-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
-r或--recursive 比较子目录中的文件。
-a或--text diff预设只会逐行比较文本文件。
-u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。
此时,在 /tmp/test.patch 档案之中,就记录了新旧的档案之间的差异, 对了!您必须要了解的是,用 diff 制作这个档案时,旧的档案必须是在前面,亦即是 diff oldfile newfile 才行!此外,新旧档案的『相对目录位置』最好也是一样比较好喔! OK!那么如何将旧的内容 (/tmp/old/passwd) 更新到新版 (/tmp/new/passwd) 的内容呢? 简单的说,可以用这样:
[root@linux ~]# patch -pN < patch_file
参数:
-p :后面可以接『取消几层目录』的意思。
范例:
范例一:将刚刚制作出来的 patch file 用来更新旧版数据
[root@linux ~]# cd /tmp/old
[root@linux ~]# patch -p1 < /tmp/test.patch
patching file passwd
# 为什么这里会使用 -p1 呢?因为我们在比对新旧版的数据时,是在 /tmp 底下,
# 而实际的数据是在 /tmp/old 里面,因此,当我们进入到 /tmp/old 时,
# 再查阅 /tmp/test.patch 的第一行如下:
# diff -Naur old/passwd new/passwd (用 head -n 1 /tmp/test.patch)
# 发现到,我们所在的目录其实是 old 里面,所以,就必须要减去一层目录。
阅读(2299) | 评论(0) | 转发(0) |