吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2524|回复: 4
收起左侧

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

  [复制链接]
wkdxz 发表于 2021-11-15 09:28
本帖最后由 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可以取走。有好的建议,请不吝赐教。


[Python] 纯文本查看 复制代码
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!')



免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Xingyemao + 1 + 1 搬走了搬走了,刚好需要

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hack78 发表于 2021-11-15 11:48
最近初学python,也在折腾脚本,楼主写的不错
Alex.Merceryj 发表于 2021-11-15 13:05
poor567 发表于 2022-5-20 18:29
showchat 发表于 2022-5-26 09:49
优秀。。。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表