任務:
你想對某個目錄樹中的被修改過的文件多次備份,以防止某次修改意外地抹去了你的編輯結果。 週期性的執行以下python腳本可以對指定目錄下的檔案進行備份。
#-*- coding:utf-8 -*- import sys,os,shutil,filecmp MAXVERSIONS = 100 def backup(tree_top, bakdir_name="bakdir"): for dir,subdirs,files in os.walk(tree_top): #确保每个目录都有一个备份目录 backup_dir = os.path.join(dir,bakdir_name) if not os.path.exists(backup_dir): os.makedirs(backup_dir) #停止对备份目录的递归 subdirs[:] = [d for d in subdirs if d != bakdir_name] for file in files: filepath = os.path.join(dir,file) destpath = os.path.join(backup_dir,file) #检查以前的版本是否存在 for index in xrange(MAXVERSIONS): backfile = '%s.%2.2d' % (destpath, index) if not os.path.exists(backfile): break if index > 0: old_backup = '%s.%2.2d' % (destpath,index-1) abspath = os.path.abspath(filepath) try: if os.path.isfile(old_backup) and filecmp.cmp(abspath, old_backup,shallow=False): continue except OSError: pass try: shutil.copy(filepath,backfile) except OSError: pass if __name__ == '__main__': try: tree_top = sys.argv[1] except IndexError: tree_top = '.' backup(tree_top)
如果想要針對某個特定後綴名的檔案進行備份,(或對除去某個副檔名以外的檔案進行備份);在 for file in files 循環內加上適當的測試即可:
for file in files: name,ext = os.path.splitext(file) if ext not in ('.py','.txt','.doc'): continue
注意以下程式碼,避免os.walk遞迴到要備份的子目錄。當os.walk迭代開始之後,os.walk根據subdirs來進行子目錄迭代。這個關於os.walk的細節也是生成器應用的一個絕佳例子,它演示了生成器是如何通過迭代的代碼獲取信息,同時又是如何反過來影響迭代。
subdirs[:] = [d for d in subdirs if d != bakdir_name]