Chinaunix首页 | 论坛 | 博客
  • 博客访问: 846775
  • 博文数量: 190
  • 博客积分: 7021
  • 博客等级: 少将
  • 技术积分: 1752
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 19:26
文章分类

全部博文(190)

文章存档

2014年(9)

2011年(32)

2010年(149)

我的朋友

分类: LINUX

2010-06-30 10:33:35

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 里面,所以,就必须要减去一层目录。 
阅读(2237) | 评论(0) | 转发(0) |
0

上一篇:linux diff命令使用

下一篇:Bash 設定

给主人留下些什么吧!~~