设计程序,有如下步骤:python
须要备份的文件和目录由一个列表指定。linux
备份应该保存在主备份目录中。windows
文件备份成一个zip文件。函数
zip存档的名称是当前的日期和时间。oop
解决方案:优化
版本一:spa
1 #!/usr/bin/python 2 #filename: backup_ver1.py 3 4 import os 5 import time 6 7 source=['/home/swaroop/byte','/home/swaroop/bin'] 8 target_dir='/mnt/e/backup/' 9 target=target_dir+time.strftime('%Y%m%d%H%M%S')+'.zip' 10 zip_command="zip -qr '%s' %s"%(target,''.join(source)) 11 12 if os.system(zip_command)==0: 13 print 'Successful backup to',target 14 else: 15 print 'Backup FAILED' 16 17 18 #输出 19 20 $ pyhon backup_ver1.py 21 Successful backup to 22 /mnt/e/backup/20041208073244.zip
以上代码里,咱们在source列表中指定须要备份的文件和目录,target_dir指定存储备份文件的目标目录,zip归档的名称是目前的日期和时间。time.strftime()函数须要咱们在上面的程序中使用的那种定制。如,%Y被年份替代,%m被月份替代,其余依次是日时分秒。zip命令有一些参数,-q表示zip命令安静地工做。-r表示zip命令对目录递归地工做,即它包括子目录以及子目录中的文件。选项后跟着zip归档的名称,而后再是待备份的文件和目录列表。咱们使用字符串join方法把source列表转换为字符串。最后os.system运行命令,成功则返回0,失败则返回错误号。操作系统
版本二:设计
对前者的优化,采用更好的文件名机制--使用时间做为文件名,日期做为目录名,存放于主备份目录中。这样更易于管理。同时,文件名得以变短。unix
代码:
1 #!/usr/bin/python 2 #filename: backup_ver2.py 3 4 import os 5 import time 6 7 source=['/home/swaroop/byte','/home/swaroop/bin'] 8 target_dir='/mnt/e/backup/' 9 today=target_dir+time.strftime('%Y%m%d) 10 now=time.strftime('%H%M%S') 11 if not os.path.exists(today): 12 os.mkdir(today) 13 print 'Successfully created directory',today 14 target=today+os.sep+now+'.zip' 15 zip_command="zip -qr '%s' %s"%(target,''.join(source)) 16 17 if os.system(zip_command)==0: 18 print 'Successful backup to',target 19 else: 20 print 'Backup FAILED' 21 22 23 #输出 24 25 $ pyhon backup_ver2.py 26 Successfully created directory 27 /mnt/e/backup/20041208 28 Successful backup to 29 /mnt/e/backup/20041208/080020.zip 30 31 $ pyhon backup_ver2.py 32 Successful backup to 33 /mnt/e/backup/20041208/080428.zip
使用os.exists函数检验在主备份目录中是否有以当前日期做为名称的目录,如果没有,便使用os.mkdir函数建立。
注意os.sep的用法--这会根据你的操做系统给出目录分隔符,即在linux、unix下它是'/',在windows下它是'\\',而在mac os下它是':'。os.sep有利于移植平台。
版本三:
在zip归档的名称上加一些用户提供的注释,便于区分不一样备份的做用。
代码:
1 #!/usr/bin/python 2 #filename: backup_ver2.py 3 4 import os 5 import time 6 7 source=['/home/swaroop/byte','/home/swaroop/bin'] 8 target_dir='/mnt/e/backup/' 9 today=target_dir+time.strftime('%Y%m%d) 10 now=time.strftime('%H%M%S') 11 comment=raw_input('Enter a comment --> ') 12 if len(comment)==0: 13 target=today+os.sep+now+'.zip' 14 else: 15 target=today+os.sep+now+'_'+\ 16 comment.replace(' ','_')+'.zip' 17 if not os.path.exists(today): 18 os.mkdir(today) 19 print 'Successfully created directory',today 20 zip_command="zip -qr '%s' %s"%(target,''.join(source)) 21 22 if os.system(zip_command)==0: 23 print 'Successful backup to',target 24 else: 25 print 'Backup FAILED' 26 27 28 #输出 29 30 $ pyhon backup_ver3.py 31 Enter a comment --> added new examples 32 Successful backup to 33 /mnt/e/backup/20041208/082156_added_new_examples.zip 34 35 $ pyhon backup_ver3.py 36 Enter a comment --> 37 Successful backup to 38 /mnt/e/backup/20041208/082316.zip
进一步优化:
改用tar命令
tar='tar -cvzf %s %s -X /home/swaroop/excludes.txt'%(targe,''.join(srcdir))
参数解释:
-c表示建立一个归档 -v表示交互,即命令更具交互性 -z表示使用gzip滤波器 -f表示强迫建立归档,即若是已经有一个同名文件,它会被替换 -X表示含在指定文件名列表中的文件会被排除在备份以外。例如,你能够在文件中指定*~,从而不让备份包括全部以~结尾的文件。
最理想的建立这些归档的方法是分别使用zipfile和tarfile。不推荐使用os.system。