zoukankan      html  css  js  c++  java
  • Python实现目录文件的全量和增量备份

    1.通过传入的路径,获取该路径下面的所有目录和文件(递归)

    方法一:使用os.listdir

    代码如下:

    #!/usr/bin/env python
    #coding:utf8
    
    import os,sys
    
    def lsdir(folder):
        contents = os.listdir(folder)
        print "%s
    %s
    " % (folder, contents)
        for path in contents:
            full_path = os.path.join(folder, path)
            if os.path.isdir(full_path):
                lsdir(full_path)
    
    if __name__ == "__main__":
        lsdir(sys.argv[1])
    

    •运行代码,效果如下:

    [root@localhost python]# python listdir.py /a
    /a
    ['b', 'a.txt']
    
    /a/b
    ['c', 'b.txt']
    
    /a/b/c
    ['c.txt']
    

    方法二:使用os.walk

    代码如下:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os,sys
    
    def lsdir(folder):
       contents = os.walk(folder)
       for path, folder, file in contents:
           print "%s
    %s
    " %(path, folder + file)
    
    if __name__ == "__main__":
        lsdir(sys.argv[1])
    

    •运行代码,测试效果

    [root@localhost python]# python listdir1.py /a
    /a
    ['b', 'a.txt']
    
    /a/b
    ['c', 'b.txt']
    
    /a/b/c
    ['c.txt']
    

    2.如何计算文件的md5值(每次读取4K,直到读取完文件所有内容,返回一个16进制的md5值)

    代码如下:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    [root@localhost python]# cat md5.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import hashlib
    import sys
    
    def md5(fname):
        m = hashlib.md5()
        with open(fname) as fobj:
            while True:
                data = fobj.read(4096)
                if not data:
                    break
                m.update(data)
        return m.hexdigest()
    
    if __name__ == "__main__":
        print md5(sys.argv[1])
    

    •运行代码,测试效果

    [root@localhost python]# python md5.py a.txt
    c33da92372e700f98b006dfa5325cf0d
    [root@localhost python]# md5sum a.txt
    c33da92372e700f98b006dfa5325cf0d  a.txt
    

    *提示:使用linux自带的md5sum和自己编写的Python计算的md5值相通

    3.编写全量和增量备份脚本

    代码如下:

    #!/usr/bin/env python
    #coding:utf8
    
    import time
    import os
    import tarfile
    import cPickle as p
    import hashlib
    
    
    def md5check(fname):
        m = hashlib.md5()
        with open(fname) as fobj:
            while True:
                data = fobj.read(4096)
                if not data:
                    break
                m.update(data)
        return m.hexdigest()
    
    
    def full_backup(src_dir, dst_dir, md5file):
        par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
        back_name = '%s_full_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
        full_name = os.path.join(dst_dir, back_name)
        md5dict = {}
    
        tar = tarfile.open(full_name, 'w:gz')
        tar.add(src_dir)
        tar.close()
        for path, folders, files in os.walk(src_dir):
            for fname in files:
                full_path = os.path.join(path, fname)
                md5dict[full_path] = md5check(full_path)
    
        with open(md5file, 'w') as fobj:
            p.dump(md5dict, fobj)
    
    
    
    def incr_backup(src_dir, dst_dir, md5file):
        par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
        back_name = '%s_incr_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
        full_name = os.path.join(dst_dir, back_name)
        md5new = {}
    
        for path, folders, files in os.walk(src_dir):
            for fname in files:
                full_path = os.path.join(path, fname)
                md5new[full_path] = md5check(full_path)
    
        with open(md5file) as fobj:
            md5old = p.load(fobj)
        
        with open(md5file, 'w') as fobj:
            p.dump(md5new, fobj)
    
        tar = tarfile.open(full_name, 'w:gz')
        for key in md5new:
            if md5old.get(key) != md5new[key]:
                tar.add(key)
        tar.close()
    
    
    if __name__ == '__main__':
        src_dir = '/Users/xkops/gxb/'
        dst_dir = '/tmp/'
        md5file = '/Users/xkops/md5.data'
        if time.strftime('%a') == 'Mon':
            full_backup(src_dir, dst_dir, md5file)
        else:
            incr_backup(src_dir, dst_dir, md5file)
    

    •运行代码,测试效果(执行前,修改需要备份的文件和路径),运行之后检查/tmp下是否生成了当天的备份文件。

  • 相关阅读:
    Microsoft .NET 框架资源基础(摘自msdn)
    cache的应用
    cache应用(asp.net 2.0 + sqlserver2005 数据依赖缓存 )
    c#遍历查找指定文件
    各浏览器目前对CSS3、HTML5的支持
    一步步构建大型网站架构
    c#连接sqlserver数据库
    C#中如何判断一个字符是汉字
    c#执行DOC命令
    VS2010快捷键
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15471666.html
Copyright © 2011-2022 走看看