每个公司对上线的业务要求都不一样,但对一些重要的文件,在线上覆盖前要全面检查文件的md5,所以这就要求获得更新前文件的md5值,然后跟研发提供的做比较,如果一致才更新,如果发现不对,就停止更新,当然逻辑都写在脚本里就可以了,因为每个公司线上服的更新逻辑都不一样,这块内容我们不做深入探讨,我们今天主要看看如何获得研发的更新文件的md5值,基本思路是这样,首先需要定义一个函数获得研发给的每个文件绝对路径,然后再定义一个函数用来返回md5值,在主函数中对每个文件调用生成md5值得函数得到md5值然后写入文件中,脚本思路就介绍到这里,我们来看代码:

#!/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数据,写入文件,最后关闭文件,这篇就到这里