Python实现网站文件的全备份和差异备份
之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:
•md5sum获取有些软连接的MD5值存在问题
•不支持对空目录进行备份,因为md5sum无法获取空目录的md5值
•权限的修改md5sum无法判断
解决方案:
利用文件的mtimectime
mtime(Modifiedtime)是在写入文件时随文件内容的更改而更改的
ctime(Createtime)是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的
废话不多说直接上代码:
#!/usr/bin/envpython
importtime,os,sys,cPickle
fileInfo={}
deflogger(time,fileName,status,fileNum):
f=open('backup.log','a')
f.write("%s\t%s\t%s\t\t%s\n"%(time,fileName,status,fileNum))
deftar(sDir,dDir,fileNum):
command="tarzcf%s%s>/dev/null2>&1"%(dDir+".tar.gz",sDir)
ifos.system(command)==0:
logger(time.strftime('%F%X'),dDir+".tar.gz",'success',fileNum)
else:
logger(time.strftime('%F%X'),dDir+".tar.gz",'failed',fileNum)
deffullBak(path):
fileNum=0
forroot,dirs,filesinos.walk(path):
fornameinfiles:
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)
defdiffBak(path):
forroot,dirs,filesinos.walk(path):
fornameinfiles:
file=os.path.join(root,name)
mtime=os.path.getmtime(file)
ctime=os.path.getctime(file)
fileInfo[file]=(mtime,ctime)
ifos.path.isfile(P)==0:
f=open(P,'w')
f.close()
ifos.stat(P).st_size==0:
f=open(P,'w')
cPickle.dump(fileInfo,f)
fileNum=len(fileInfo.keys())
f.close()
printfileNum
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)
printfileNum
difference_file=''.join(difference.keys())
printdifference_file
tar(difference_file,D,fileNum)
f=open(P,'w')
cPickle.dump(fileInfo,f)
f.close()
defUsage():
print'''
Syntax:pythonfile_bakcup.pypickle_filemodelsource_dirfilename_bk
model:1:Fullbackup2:Differentialbackup
example:pythonfile_backup.pyfileinfo.pk2/etcetc_$(date+%F)
explain:Automaticallyadd'.tar.gz'suffix
'''
sys.exit()
iflen(sys.argv)!=5:
Usage()
P=sys.argv[1]
M=int(sys.argv[2])
S=sys.argv[3]
D=sys.argv[4]
ifM==1:
fullBak(S)
elifM==2:
diffBak(S)
else:
print"\033[;31mDoesnotsupportthismode\033[0m"
Usage()
测试:
$pythonfile_backup.pydata.pk1datadata_$(date+%F)#全备份 $>data/www.nhooo.com#测试创建文件,修改文件权限 $chmod777data/py/eshop_bk/data.db $pythonfile_backup.pydata.pk2datadata_$(date+%F)_1#备份改变的文件 2 data/py/eshop_bk/data.dbdata/www.nhooo.com
看了博主的代码,很受启发,但是有一个问题,如果我完成完整备份之后,删除了其中某个文件,再做差异备份,可以检测出被删除的文件,但是执行tar就会出错,因为这个文件已经是不存在的了,所以在执行tar之前,最好用os.path.exists()判断一下差异文件路径是否存在,如果不存在则不执行tar,反馈一条文件删除信息。