python运维开发常用模块(5)文件目录对比模块filecmp

1.filecmp模块介绍

当我们进行代码审计或校验备份结果时,往往需要检查原始与目 标目录的文件一致性,Python的标准库已经自带了满足此需求的模块 filecmp。filecmp可以实现文件、目录、遍历子目录的差异对比功能。比 如报告中输出目标目录比原始多出的文件或子目录,即使文件同名也会 判断是否为同一个文件(内容级对比)等,Python 2.3或更高版本默认 自带filecmp模块,无需额外安装,下面进行详细介绍。

2.模块常用方法说明

filecmp提供了三个操作方法,分别为cmp(单文件对比)、 cmpfiles(多文件对比)、dircmp(目录对比),下面逐一进行介绍: ·

单文件对比:

采用filecmp.cmp(f1,f2[,shallow])方法,比较文 件名为f1和f2的文件,相同返回True,不相同返回False,shallow默认为 True,意思是只根据os.stat()方法返回的文件基本信息进行对比,比 如最后访问时间、修改时间、状态改变时间等,会忽略文件内容的对 比。当shallow为False时,则os.stat()与文件内容同时进行校验。

示例:比较单文件的差异

>>> import filecmp
>>> from filecmp import cmp
>>> cmp('/home/yhl/devpython/part2/nginx.conf.v1','/home/yhl/devpython/part2/nginx.conf.v2')
False
>>> cmp('/home/yhl/devpython/part2/nginx.conf.v1','/home/yhl/devpython/part2/nginx.conf.v0')
True

多文件对比:

采用filecmp.cmpfiles(dir1,dir2,common[, shallow])方法,对比dir1与dir2目录给定的文件清单。该方法返回文件 名的三个列表,分别为匹配、不匹配、错误。匹配为包含匹配的文件的 列表,不匹配反之,错误列表包括了目录不存在文件、不具备读权限或 其他原因导致的不能比较的文件清单

示例:dir1与dir2目录中指定文件清单对比。

两目录下文件的md5信息如下,其中f1、f2文件匹配;f3不匹配; f4、f5对应目录中不存在,无法比较。

创建测试文件:

[yhl@myhost part2]$ mkdir dir1
[yhl@myhost part2]$ mkdir dir2
[yhl@myhost part2]$ cd dir1
[yhl@myhost dir1]$ echo f1 >f1
[yhl@myhost dir1]$ echo f2 >f2
[yhl@myhost dir1]$ echo f3 >f3
[yhl@myhost dir1]$ echo f5 >f5
[yhl@myhost dir1]$ cd ../dir2
[yhl@myhost dir2]$ echo f1 >f1
[yhl@myhost dir2]$ echo f2 >f2
[yhl@myhost dir2]$ echo f03 >f3
[yhl@myhost dir2]$ echo f4 >f4

对比dir1和dir2目录下文件的md5

[yhl@myhost dir1]$ md5sum *
2b1abc6b6c5c0018851f9f8e6475563b  f1
575c5638d60271457e54ab7d07309502  f2
3385b5d27d4c2923e9cde7ea53f28e2b  f3
4c89aa650e394e642f6a84df6cdb08a4  f5
[yhl@myhost dir1]$ cd -
/home/yhl/devpython/part2/dir2
[yhl@myhost dir2]$ md5sum *
2b1abc6b6c5c0018851f9f8e6475563b  f1
575c5638d60271457e54ab7d07309502  f2
287df2010a083579b709b63445a32cc3  f3
5f3022d3a5cbcbf30a75c33ea39b2622  f4

使用cmpfiles对比的结果如下,符合我们的预期。

f1、f2文件匹配;f3不匹配; f4、f5对应目录中不存在,无法比较。

>>> from filecmp import cmpfiles
>>> cmpfiles("/home/yhl/devpython/part2/dir1","/home/yhl/devpython/part2/dir2",['f1','f2','f3','f4','f5'])
(['f1', 'f2'], ['f3'], ['f4', 'f5'])

目录对比,通过dircmp(a,b[,ignore[,hide]])类创建一个目录 比较对象,其中a和b是参加比较的目录名。ignore代表文件名忽略的列 表,并默认为['RCS' , 'CVS' , 'tags'];hide代表隐藏的列表,默认为 [os.curdir,os.pardir]。dircmp类可以获得目录比较的详细信息,如只有 在a目录中包括的文件、a与b都存在的子目录、匹配的文件等,同时支 持递归。

猜你喜欢

转载自www.cnblogs.com/benjamin77/p/10856469.html
今日推荐