分类: LINUX
2012-05-23 14:49:47
关于该脚本的用途,可以参考本人的另一篇文章:http://hi.baidu.com/dbsync/blog/item/9db813de35a246accc11665c.html
该脚本有两个版本:一个是运行在Linux系统下的,一个是运行在windows系统下的,本来还想提供一个EXE文件,但是百度空间不支持上传该类型的附件……汗一个……
由于百度空间不支持单篇文章超过40000字符(再汗一个……),故分成两篇,Windows版的请查看另一片文章。
由于Linux系统对中文支持不是很好,如果在Linux系统上打开该代码,其中的注释可能会显示为乱码。
该脚本经过本人实际应用,都能正常使用。需要注意的一点是所要备份的文件名不能过长,否则可能会备份失败。
本次脚本提供日志功能,所有的备份日志都会被记录并保存在一个文件中。
如果有什么问题,欢迎给我留言,大家共同学习讨论。
以下是源代码:
===================华丽分割线:-)========================
Linux系统所用:
#coding=utf8
#! /usr/bin/env python
import os
mark=0 #全局变量,统计总共有多少文件被复制
def logs(value): #记录日志函数
v1=open('backup_files.log','ab')
v1.write(value)
v1.close()
def erro(value1,value2,value3): #搜集错误信息函数
renameerro={} #存放重命名失败的文件名及失败原因
copyerro={} #存放复制失败的文件名及失败原因
removerro={} #存放删除失败的文件名及失败原因
mkdirerro={} #存放创建路径失败的路径名及失败原因
if value1=='renameerro' and value2 not in renameerro.keys():
renameerro[value2]=value3
elif value1=='copyerro' and values2 not in copyerro.keys():
copyerro[value2]=value3
elif value1=='removerro' and value2 not in removerro.keys():
removerro[value2]=value3
elif value1=='mkdirerro' and value2 not in mkdirerro.keys():
mkdirerro[value2]=value3
else:
pass
v1=[renameerro,copyerro,removerro,mkdirerro]
return v1
def printerro(value): #打印错误信息函数
renameerro=value[0]
copyerro=value[1]
removerro=value[2]
mkdirerro=value[3]
if len(renameerro)!=0:
print '\n---These are the files to rename faise:'
tmp='\n---These are the files to rename faise:'
logs(tmp)
for a in renameerro.keys():
print a+',The reason is:'+str(renameerro[a])
tmp=a+',The reason is:'+str(renameerro[a])
logs(tmp)
if len(copyerro)!=0:
print '\n---These are the files to copy faise:'
tmp='\n---These are the files to copy faise:'
logs(tmp)
for a in copyerro.keys():
print a+',The reason is:'+str(copyerro[a])
tmp=a+',The reason is:'+str(copyerro[a])
logs(tmp)
if len(removerro)!=0:
print '\n---These are the files to remove faise:'
tmp='\n---These are the files to remove faise:'
logs(tmp)
for a in removerro.keys():
print a+',The reason is:'+str(removerro[a])
tmp=a+',The reason is:'+str(removerro[a])
logs(tmp)
if len(mkdirerro)!=0:
print '\n---These are the files to create path faise:'
tmp='\n---These are the files to create path faise:'
logs(tmp)
for a in mkdirerro.keys():
print a+',The reason is:'+str(mkdirerro[a])
tmp=a+',The reason is:'+str(mkdirerro[a])
logs(tmp)
def src_dir(): #源端路径设置函数
while 1:
v1=raw_input('\n---Please enter the source path:\n\n>>')
if len(v1)==0:
print '\n---Error!! Source path can not be NULL!'
continue
if not os.path.exists(v1): #判断该路径是否存在
print '\n---Error!! Source path is not exist!'
continue
v2=os.walk(v1)
mark=0 #判断该路径下是否有文件
for a in v2:
if a[2]!=0:
mark=1
break
if mark==0:
print '\n---Error!! Without any valid files in source path!'
exit() #没有文件的话,整个脚本退出
else:
break
return v1
def targ_dir(): #目标端路径设置函数
while 1:
mark=0
v1=raw_input('\n---Please enter the target path:\n\n>>')
if len(v1)==0:
print '\n---Error!! The target path can not be NULL!'
mark=1
continue
if not os.path.exists(v1): #判断该路径是否存在
print '\n---Error!!Target-side path does not exist'
mark=1
continue
if mark==0:
break
return v1
def copyfile(src,targ): #文件拷贝函数
v1=open(src,'rb') #打开源端文件
v2=open(targ,'wb') #打开目标端文件
print '\n---Copying file %s ....'%src
while True: #拷贝循环
v3=v1.read(1024*15000) #每次从源端文件中读取15MB的内容
v2.write(v3) #把数据写入目标端文件
if len(v3)<1024*15000: #判断源端文件是否被全部读完
break
v1.close()
v2.close()
print '\n---Complete copy of the file %s '%src
tmp='\n---Complete copy of the file %s '%src
logs(tmp)
def main(src,targ): #主函数
global mark #使用全局变量mark,统计总共有多少文件被复制
v1=os.listdir(src) #获得源端目录下所有的文件及文件夹
for a in v1: #备份文件主循环
if os.path.isfile(src+'/'+a): #判断是否为文件
if os.path.exists(targ+'/'+a): #如果该文件在目标端已经存在
if os.path.getsize(src+'/'+a)>os.path.getsize(targ+'/'+a): #如果源端文件的大小大于目标端
while True: #确定重命名后的文件名称
if os.path.exists(targ+'/'+a+'.bak'):
a=a+'.bak'
continue
else:
break
try:
os.rename(targ+'/'+a,targ+'/'+a+'.bak') #重命名目标端该文件
except Exception,e:
print '\n---Error!! Rename the file error : %s'%(targ+'/'+a)
erro('renameerro',targ+'/'+a,e)
print e
continue #如果重命名失败,则不再处理该文件,进入主循环的下一次循环
try:
copyfile(src+'/'+a,targ+'/'+a) #开始复制文件
except Exception,e:
print '\n---Error!! Copy the file error : %s'%(src+'/'+a)
erro('copyerro',src+'/'+a,e)
print e
continue #如果复制失败,则不再处理该文件,进入主循环的下一次循环
try:
os.remove(targ+'/'+a+'.bak') #移除目标端旧的文件
mark=mark+1
except Exception,e:
print '\n---Error!! Remove the file error : %s'%(targ+'/'+a+'.bak')
erro('removerro',targ+'/'+a+'.bak',e)
print e
continue #如果删除失败,则不再处理该文件,进入主循环的下一次循环
elif os.path.getmtime(src+'/'+a)>os.path.getmtime(targ+'/'+a): #如果源端文件的最新修改日期比目标端文件新
while True:
if os.path.exists(targ+'/'+a+'.bak'):
a=a+'.bak'
continue
else:
break
try:
os.rename(targ+'/'+a,targ+'/'+a+'.bak')
except Exception,e:
print '\n---Error!! Rename the file error : %s'%(targ+'/'+a)
erro('renameerro',targ+'/'+a,e)
print e
continue
try:
copyfile(src+'/'+a,targ+'/'+a)
except Exception,e:
print '\n---Error!! Copy the file error : %s'%(src+'/'+a)
erro('copyerro',src+'/'+a,e)
print e
continue
try:
os.remove(targ+'/'+a+'.bak')
mark=mark+1
except Exception,e:
print '\n---Error!! Remove the file error : %s'%(targ+'/'+a+'.bak')
erro('removerro',targ+'/'+a+'.bak',e)
print e
continue
else:
pass
else: #如果该文件在目标端不存在
if not os.path.isdir(targ): #如果该文件所在路径在目标端不存在
try:
os.makedirs(targ) #在目标端建立相应的路径
except Exception,e:
print '\n---Error!! Error creating path : %s'%(targ)
erro('mkdirerro',targ,e)
print e
continue
try:
copyfile(src+'/'+a,targ+'/'+a)
mark=mark+1
except Exception,e:
print '\n---Error!! Copy file error : %s'%(src+'/'+a)
erro('copyerro',src+'/'+a,e)
print e
continue
else: #如果a是个文件夹
main(src+'/'+a,targ+'/'+a) #再次调用主函数
return mark
if __name__=='__main__':
v1=src_dir()
v2=targ_dir()
v3=main(v1,v2)
print '\n--- All files processed! Handled a total of %d files !'%v3
tmp='\n--- All files processed! Handled a total of %d files !'%v3
logs(tmp)
printerro(erro('1','2','3'))
print '\n---Run log saved in the file "backup_files.log"'
本文转载自:http://hi.baidu.com/dbsync/blog/item/87b00edf704b9ffc76c63891.html