本帖最后由 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!')
|