設計程序,有如下步驟: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。