每个公司对上线的业务要求都不一样,但对一些重要的文件,在线上覆盖前要全面检查文件的md5,所以这就要求获得更新前文件的md5值,然后跟研发提供的做比较,如果一致才更新,如果发现不对,就停止更新,当然逻辑都写在脚本里就可以了,因为每个公司线上服的更新逻辑都不一样,这块内容我们不做深入探讨,我们今天主要看看如何获得研发的更新文件的md5值,基本思路是这样,首先需要定义一个函数获得研发给的每个文件绝对路径,然后再定义一个函数用来返回md5值,在主函数中对每个文件调用生成md5值得函数得到md5值然后写入文件中,脚本思路就介绍到这里,我们来看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/usr/bin/python import sys import os import hashlib if len(sys.argv) < 2: print 'this script need a arv' sys.exit(0) if not os.path.exists(sys.argv[1]) or not os.path.isdir(sys.argv[1]): print 'it is not exists or not a dir' sys.exit(1) def getmd5(filename): m = hashlib.md5() mfile = open(filename, 'rb') m.update(mfile.read()) mfile.close() md5value = m.hexdigest() return (md5value+"\t"+ filename) def all_files(root): flist = [] for path, subdirs, files in os.walk(root): for f in files: flist.append(os.path.join(path, f)) return flist if __name__ == '__main__': outfile = open('md5file.txt', 'a+') flist = all_files(sys.argv[1]) for fi in flist: res = getmd5(fi) outfile.write(res + '\n') outfile.close() |
脚本解释,最前开始导入需要的模块,之前python还单独有个md5模块,现在基本不用了,都用hashlib了,这个功能更为强大,先定义了一个getmd5()的函数,接收一个文件当做参数,hashlib.md5()生成hash对象,然后调用update()方法将字符串计算出md5值,接下来定义了all_files()函数,这个函数接收一个目录,然后得到文件的绝对路径,加入到列表中,返回。
在主函数中,打开一个文件md5file.txt来存储获得的文件名和对应的md5值,循环flist列表,将文件传入getmd5()函数,获得文件和md5数据,写入文件,最后关闭文件,这篇就到这里,如有问题,请各位留言吧。