Python 实现文件的全备份和差异备份详解
作者:lqh 时间:2023-07-16 20:20:36
Python实现文件的全备份和差异备份
之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:
md5sum获取有些软连接的MD5值存在问题
不支持对空目录进行备份,因为md5sum无法获取空目录的md5值
权限的修改md5sum无法判断
解决方案:
利用文件的mtime ctime
mtime(Modified time)是在写入文件时随文件内容的更改而更改的
ctime(Create time)是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的
废话不多说直接上代码:
#!/usr/bin/env python
import time,os,sys,cPickle
fileInfo = {}
def logger(time,fileName,status,fileNum):
f = open('backup.log','a')
f.write("%s\t%s\t%s\t\t%s\n" % (time,fileName,status,fileNum))
def tar(sDir,dDir,fileNum):
command = "tar zcf %s %s >/dev/null 2>&1" % (dDir + ".tar.gz",sDir)
if os.system(command) == 0:
logger(time.strftime('%F %X'),dDir + ".tar.gz",'success',fileNum)
else:
logger(time.strftime('%F %X'),dDir + ".tar.gz",'failed',fileNum)
def fullBak(path):
fileNum = 0
for root,dirs,files in os.walk(path):
for name in files:
file = os.path.join(root, name)
mtime = os.path.getmtime(file)
ctime = os.path.getctime(file)
fileInfo[file] = (mtime,ctime)
fileNum += 1
f = open(P,'w')
cPickle.dump(fileInfo,f)
f.close()
tar(S,D,fileNum)
def diffBak(path):
for root,dirs,files in os.walk(path):
for name in files:
file = os.path.join(root,name)
mtime = os.path.getmtime(file)
ctime = os.path.getctime(file)
fileInfo[file] = (mtime,ctime)
if os.path.isfile(P) == 0:
f = open(P,'w')
f.close()
if os.stat(P).st_size == 0:
f = open(P,'w')
cPickle.dump(fileInfo,f)
fileNum = len(fileInfo.keys())
f.close()
print fileNum
tar(S,D,fileNum)
else:
f = open(P)
old_fileInfo = cPickle.load(f)
f.close()
difference = dict(set(fileInfo.items())^set(old_fileInfo.items()))
fileNum = len(difference)
print fileNum
difference_file = ' '.join(difference.keys())
print difference_file
tar(difference_file,D,fileNum)
f = open(P,'w')
cPickle.dump(fileInfo,f)
f.close()
def Usage():
print '''
Syntax: python file_bakcup.py pickle_file model source_dir filename_bk
model: 1:Full backup 2:Differential backup
example: python file_backup.py fileinfo.pk 2 /etc etc_$(date +%F)
explain: Automatically add '.tar.gz' suffix
'''
sys.exit()
if len(sys.argv) != 5:
Usage()
P = sys.argv[1]
M = int(sys.argv[2])
S = sys.argv[3]
D = sys.argv[4]
if M == 1:
fullBak(S)
elif M == 2:
diffBak(S)
else:
print "\033[;31mDoes not support this mode\033[0m"
Usage()
测试:
$ python file_backup.py data.pk 1 data data_$(date +%F) #全备份
$ > data/www.linuxeye.com #测试创建文件,修改文件权限
$ chmod 777 data/py/eshop_bk/data.db
$ python file_backup.py data.pk 2 data data_$(date +%F)_1 #备份改变的文件
2
data/py/eshop_bk/data.db data/www.linuxeye.com
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
标签:Python,文件全备份,差异备份
0
投稿
猜你喜欢
ASP.NET Core优雅的在开发环境保存机密(User Secrets)
2023-07-15 20:25:37
详谈python3中用for循环删除列表中元素的坑
2023-08-01 06:04:31
python编写脚本之pyautogui的安装和使用教程
2021-06-17 09:48:11
python 基本结构语句(函数和模块)
2023-06-14 00:37:56
asp小偷程序原理和简单示例
2007-11-05 17:12:00
python使用python-pptx删除ppt某页实例
2022-10-23 16:19:59
js中的for如何实现foreach中的遍历
2024-04-29 13:19:37
Python生成随机验证码代码实例解析
2023-08-28 20:48:58
Pygame Draw绘图函数的具体使用
2021-05-24 12:14:49
Pygame代码 制作一个贪吃蛇小游戏
2022-06-29 03:04:27
细化解析:怎样把你的MySQL完全中文化
2008-12-19 17:48:00
详解链接的rel与target
2007-11-05 18:25:00
python如何将图片生成视频MP4
2023-10-19 09:25:37
Oracle 下医嘱执行函数
2009-03-02 10:49:00
Asp教程:Response对象
2007-10-01 18:08:00
Python叠加两幅栅格图像的实现方法
2023-07-25 17:14:06
详解Python下Flask-ApScheduler快速指南
2023-12-25 07:37:34
Python如何使用函数做字典的值
2021-10-24 02:28:05
Python实现大数据收集至excel的思路详解
2022-02-03 10:25:25
Python 工具类实现大文件断点续传功能详解
2022-11-17 05:41:29