背景
创新互联-专业网站定制、快速模板网站建设、高性价比宜黄网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式宜黄网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖宜黄地区。费用合理售后完善,十多年实体公司更值得信赖。
在Linux系统环境的工作过程中,经常遇到需要对比文件差异的情况,此时,使用Linux提供的diff工具可以方便的发现文件不同版本之间差异,从而快速排除解决问题。
Windows端有强大文件对比工具BeyondCompare。
patch 命令可以将diff命令的输出应用到原始的对比文件中,将新版本的更新应用到原始的文件中。
命令
diff [option] [file1] [file2]
patch [option] [file1] [file_differ]
测试环境
WSL: Linux PERSONALPC 4.4.0-19041-Microsoft #488-Microsoft Mon Sep 01 13:43:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux
测试过程
目前在各 Linux 发行版中, 比较著名的软件包管理系统有如下两种:
RPM: Red Hat/Fedora,Suse,Mandriva 使用的是这类管理系统。
DPKG: Debian,ubuntu使用的是这类管理系统。
UOS是基于Debian发行版本,因此UOS使用的是DPKG包管理机制。
Redhat的rpm软件包管理相信大家都很熟悉,这里主要讲UOS系统的软件升级的源配置,在/etc/apt/sources.list。文件内容的格式如下:
deb [by-hash=force] eagle main contrib non-free
其中,第一列描述了文件类型,是deb类型还是deb-src类型,deb是已经编译好的二进制软件包,deb-src是源码包,第二列是使用的镜像地址,apt可以使用多种类型的镜像地址,如:http、ftp、file等。其中,eagle 是系统的codename。 main non-free contrib是源下面不同的目录,每个目录放一类软件,即不同的子仓库。
在每次修改sources.list文件后,都需要运行apt-get update命令更新源列表系统中所有packages的信息都在 /var/lib/dpkg/目录下, 其子目录 /var/lib/dpkg/info 用于保存各个软件包的配置文件列表,/var/lib/dpkg/available文件的内容是软件包的描述信息, 该软件包括当前系统所使用的深度安装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包。/var/cache/apt/archives目录是在用 apt-get install 安装软件包时,软件包的临时存放路径,而/etc/apt/sources.list 存放的是软件源站点, 当执行 apt-get install package-name 时,软件包就去这些站点下载软件包到本地并执行安装。
红帽系统与UOS的基本操作命令基本相同,属于Linux基本操作命令。二者命令的主要区别在软件包的管理上,下面就针对二者对软件包的管理命令进行对比。
表1 rpm与dpkg软件包管理常用命令对比
表2 yum与apt软件包管理常用命令对比
注:yumdownloader命令需要安装yum-utils*
在linux系统中有两种方式可以实现两个文件的对比
第一传统的命令行方式 应用diff命令
diff的功能为逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。
diff
语法
diff
[options]
file1
file2
命令字
参数
待对比文件1
待对比文件2
[options]的主要参数
-a:将所有文件当作文本文件来处理。
-b或–ignore-space-change
忽略空格造成的不同。
-B或–ignore-blank-lines
忽略空行造成的不同。
-c:使用纲要输出格式。
-H:利用试探法加速对大文件的搜索。
-I:忽略大小写的变化。
-n
–rcs:输出RCS格式。
-N或–new-file
在比较目录时,若文件A仅出现在某个目录中,会显示:Only
in目录;文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-r或–recursive
比较子目录中的文件。
-u,-U列数或–unified=列数
以合并的方式来显示文件内容的不同。
第二种方式是图形界面交互方式
该方式要安装第三方工具软件比如Kompare软件包,这个工具可以让用户可以查看文件之间的差异,并且合并文件。
如果想对两个有序的文件进行比较,可以使用comm命令。
语法:comm [- 123 ] file1 file2
说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。
comm -1 不显示只出现在第一个文件的行。
comm -2 不显示只出现在第二个文件的行。
comm -3 不显示同时出现在两个文件的行。
comm file1 file2 显示三列,第一列代表只出现在file1的行,第二列代表只出现在file2的行,第三列代表俩个文件同时出现的行
comm -12 显示两个文件同时出现的行 也就是交集
comm -13 显示只出现在第二个文件的行
comm -23 显示只出现在第一个文件的行
例如:假设要对文件myfile1和myfile2进行比较
$ cat myfile1
main( )
{
float a,b, i, j ,z ;
a=i=10 ; b=j=5 ;
z= i + j ;
printf(“z=%d\\\\n”,z) ;
}
$ cat myfile2
#include stdio.h
main( )
{
float i, j ,z ;
i=10 ; j=5 ;
z= i + j ;
printf(“z=%f\\\\n”,z) ;
}
$ comm - 12 myfile1 myfile2
main( )
{
z= i + j ;
}
就只显示文件myfile1和myfile2中共有的行。
可以用diff命令对比文档内容。
[语法]: diff [参数] 文件1 文件2
[说明]: 本命令比较两个文本文件,将不同的行列出来
-b 将一串空格或TAB 转换成一个空格或TAB
-e 生成一个编辑角本,作为ex 或ed 的输入可将文件1 转换成文件2
[例子]:
diff file1 file2
diff -b file1 file2
diff -e file1 file2 edscript
diff 命令的常用参数
a 将所有文件当做文本文件来处理
b 忽略空格造成的不同
B 忽略空行造成的不同
q 只报告什么地方不同,不报告具体的不同信息
H 利用试探法加速对大文件的搜索
i 忽略大小写的变化
l 用pr对输出进行分页
r 在比较目录时比较所有的子目录
s 两个文件相同时才报告
v 在标准输出上输出版本信息并退出
实例:比较两个文件
代码如下:
[root@localhost test3]# diff log2014.log log2013.log
----------------------------------------------------------------------------
3c3
《 2014-03
---
》 2013-03
8c8
《 2013-07
---
》 2013-08
11,12d10
《 2013-11
《 2013-12
----------------------------------------------------------------------------
说明:上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;“11,12d10”表示第一个文件比第二个文件多了第11和12行。
Y:diff命令
●简介
★diff命令用于比较文件的差异。
★diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
●语法
★命令格式:diff[参数][文件1或目录1][文件2或目录2]
★参数:
☆-行数 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
☆-a或--text diff预设只会逐行比较文本文件。
☆-b或--ignore-space-change 不检查空格字符的不同。
☆-B或--ignore-blank-lines 不检查空白行。
☆-c 显示全部内文,并标出不同之处。
☆-C行数或--context行数 与执行"-c-行数"指令相同。
☆-d或--minimal 使用不同的演算法,以较小的单位来做比较。
☆-D巨集名称或ifdef巨集名称 此参数的输出格式可用于前置处理器巨集。
☆-e或--ed 此参数的输出格式可用于ed的script文件。
☆-f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
☆-H或--speed-large-files 比较大文件时,可加快速度。
☆-l字符或字符串或--ignore-matching-lines字符或字符串 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
☆-i或--ignore-case 不检查大小写的不同。
☆-l或--paginate 将结果交由pr程序来分页。
☆-n或--rcs 将比较结果以RCS的格式来显示。
☆-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
☆Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
☆-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
☆-P或--unidirectional-new-file 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
☆-q或--brief 仅显示有无差异,不显示详细的信息。
☆-r或--recursive 比较子目录中的文件。
☆-s或--report-identical-files 若没有发现任何差异,仍然显示信息。
☆-S文件或--starting-file文件 在比较目录时,从指定的文件开始比较。
☆-t或--expand-tabs 在输出时,将tab字符展开。
☆-T或--initial-tab 在每行前面加上tab字符以便对齐。
☆-u,-U列数或--unified=列数 以合并的方式来显示文件内容的不同。
☆-v或--version 显示版本信息。
☆-w或--ignore-all-space 忽略全部的空格字符。
☆-W宽度或--width宽度 在使用-y参数时,指定栏宽。
☆-x文件名或目录或--exclude文件名或目录 不比较选项中所指定的文件或目录。
☆-X文件或--exclude-from文件 您可以将文件或目录类型存成文本文件,然后在=文件中指定此文本文件。
☆-y或--side-by-side 以并列的方式显示文件的异同之处。
☆--help 显示帮助。
☆--left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
☆--suppress-common-lines 在使用-y参数时,仅显示不同之处。
●案例
★实例一:比较两个文件
[root@localhost test3]# diff log2014.log log2013.log
3c3
2014-03
---
2013-03
8c8
2013-07
---
2013-08
11,12d10
2013-11
2013-12
☆上面的"3c3"和"8c8"表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。
★实例二:并排格式输出
[root@localhost test3]# diff log2014.log log2013.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11
2013-12
[root@localhost test3]# diff log2013.log log2014.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10
2013-11
2013-12
★说明:
☆"|"表示前后2个文件内容有不同;
☆""表示后面文件比前面文件少了1行内容;
☆""表示后面文件比前面文件多了1行内容;