Python 递归函数详解及实例
这篇文章主要介绍了Python 实现文件的全备份和差异备份详解的相关资料,需要的朋友可以参考下
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 递归函数详解及实例相关文章请关注PHP中文网!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。
