wkdxz 发表于 2021-11-15 09:28

[Python]文件备份脚本,可实现文件历史版本备份功能

本帖最后由 wkdxz 于 2021-11-15 13:43 编辑

仰慕52的大神已久了,一直没能加入组织,终于在双11蹭了一波开放注册。把自己平时用的脚本发点出来蹭点活跃度。水平有限,写得不好,请大神们轻喷!


思路:
      有几个放置重要文件的目录,经常更新,有时还要找寻文件的历史版本,找了一些目录备份的软件,但对于历史功能实现起来都比较麻烦,而且不一定适合我自己的要求。所以使用Python自己写。虽然功能简单,但胜在纯手工书写,安全性很放心,而且想要别的功能,也可以随时添加进去。


功能:
      将指定目录的文件(源,可以定义多个需要备份的目录)从备份到另一个目录里(目标),可以指定多个目标目录(备份多份)。


流程:
      如果目标目录内已存在同名文件,则检测文件MD5,如果MD5不一致,则在同级目录新建一个“文件名_Backup”目录,将已存在的文件移动到“文件名_Backup”目录内,并在文件名内加上源文件的修改日期(便于区分),也相当于存储文件的历史版本(历史更新频率为备份频率)


使用到的第三方库hashlib、glob,常规安装方法即可食用:
      pip install hashlib
      pip install glob


使用脚本需要修改的位置:
      66-69行:自定义需要备份的目录
      74-75行:存储备份的目录,我指定了两个目录


我的使用方法:
      将脚本加入计划任务,每50分钟执行一次。


再次说明:
      代码简陋,刚好够我用,如果有需要的xdm可以取走。有好的建议,请不吝赐教。


from glob import glob
from os import path, stat, rename, makedirs
import shutil
import hashlib
import time


def getFiles(mulu):
    files = []
    for file in glob(mulu + r'\**\*.*', recursive=True):
      files.append(file)
    return files


def getHash(file):
    f = open(file, "rb")
    rb = f.read()
    return hashlib.md5(rb).hexdigest()


def reFile(file):
    mtime = stat(file).st_mtime
    txtmtime = time.strftime('%Y%m%d.%H%M%S', time.localtime(mtime))
    wenjian, houzhui = path.splitext(file)
    return wenjian + '_' + txtmtime + houzhui


def md(mulu):
    if not path.exists(mulu):
      makedirs(mulu)


def backup(smulu, tmulu):
    tmulu = tmulu + '/' + smulu.split('\\')[-1]#备份的目录名要加上去
    files = getFiles(smulu)
    # print(files)
    for i in files:
      newfile = tmulu + i.replace(smulu, '')
      # print(newfile)
      lj = path.dirname(newfile)
      # print(lj)
      if not path.exists(lj):
            md(lj)

      if not path.exists(newfile):#如果文件不存在,就直接拷贝
            shutil.copyfile(i, newfile)
            print('【拷贝】 ' + newfile)
      else:#文件存在,则判断MD5
            if getHash(i) == getHash(newfile):
                # print('【已存在MD5】 ' + newfile)
                continue#如果目标文件与源文件MD5一致,则直接跳过
            else:#新旧文件MD5不一致
                backMulu = newfile + '_Backup'
                md(backMulu)#建立一个“以文件命名的文件夹”
                backfile = reFile(newfile)#将旧文件按修改时间命名
                print('MD5不一致:' + backfile)
                shutil.move(newfile,
                            path.join(backMulu,
                                    path.basename(backfile)))#剪切重命名的文件到备份目录
                shutil.copyfile(i, newfile)#最后再把新文件拷贝过去

if __name__ == '__main__':
    smulus = r'''
    E:\桌面文件
    E:\管理系统
    E:\Backup\脚本
    C:\Users\Administrator\AppData\Roaming\Tencent\DeskGo
    '''

    tmulus = r'''
    E:/增量备份目录
    F:/增量备份目录
    '''

    for i in smulus.strip().replace('\r', '').split('\n'):
      for j in tmulus.strip().replace('\r', '').split('\n'):
            i = i.strip()
            j = j.strip()
            try:
                backup(i, j)
            except:
                continue
    print('Done!')


hack78 发表于 2021-11-15 11:48

最近初学python,也在折腾脚本,楼主写的不错

Alex.Merceryj 发表于 2021-11-15 13:05

好家伙,定时任务去判断MD5增量备份

poor567 发表于 2022-5-20 18:29

牛逼,增量阅读备份神器

showchat 发表于 2022-5-26 09:49

优秀。。。。。。
页: [1]
查看完整版本: [Python]文件备份脚本,可实现文件历史版本备份功能