タスク:
特定の変更によって編集結果が誤って消去されるのを防ぐために、特定のディレクトリ ツリー内の変更されたファイルを複数回バックアップしたいと考えています。次の 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)
特定のサフィックスを持つファイルをバックアップする場合 (または、特定の拡張子を除いてファイルをバックアップする場合)、files ループの for file に適切なテストを追加するだけです。 os.walk はバックアップ対象のサブディレクトリを再帰的に実行します。 os.walk の反復が開始されると、os.walk はサブディレクトリに基づいてサブディレクトリを反復します。 os.walk に関するこの詳細は、ジェネレーターの使用の優れた例でもあり、ジェネレーターが反復コードからどのように情報を取得し、それが反復にどのように影響するかを示しています。
りー