2011-02-05 8 views
2

私はコードの説明を与えてください。特に、 "for f in files:"の行に続くmaxversionsやステートメントの使用を教えてください。Pythonのバックアップスクリプト

xrange(MAXVERSION)の意味は分かりますか?インデックスの使用はすなわち

for index in xrange(MAXVERSIONS): backup = '%s.%2.2d' % (destpath, index) 

コードとは何ですか:

!/usr/bin/env python 

import sys,os, shutil, filecmp 

MAXVERSIONS=100 
BAKFOLDER = '.bak' 

def backup_files(tree_top, bakdir_name=BAKFOLDER): 

    top_dir = os.path.basename(tree_top) 
    tree_top += os.sep 

    for dir, subdirs, files in os.walk(tree_top): 

     if os.path.isabs(bakdir_name): 
      relpath = dir.replace(tree_top,'') 
      backup_dir = os.path.join(bakdir_name, top_dir, relpath) 
     else: 
      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 f in files: 
      filepath = os.path.join(dir, f) 
      destpath = os.path.join(backup_dir, f) 
       for index in xrange(MAXVERSIONS): 
       backup = '%s.%2.2d' % (destpath, index) 
       abspath = os.path.abspath(filepath) 

       if index > 0: 

        old_backup = '%s.%2.2d' % (destpath, index-1) 
        if not os.path.exists(old_backup): break 
        abspath = os.path.abspath(old_backup) 

        try: 
         if os.path.isfile(abspath) and filecmp.cmp(abspath, filepath, shallow=False): 
          continue 
        except OSError: 
         pass 

       try: 
        if not os.path.exists(backup): 
         print 'Copying %s to %s...' % (filepath, backup) 
         shutil.copy(filepath, backup) 
       except (OSError, IOError), e: 
        pass 

if __name__=="__main__": 
    if len(sys.argv)<2: 
     sys.exit("Usage: %s [directory] [backup directory]" % sys.argv[0]) 

    tree_top = os.path.abspath(os.path.expanduser(os.path.expandvars(sys.argv[1]))) 

    if len(sys.argv)>=3: 
     bakfolder = os.path.abspath(os.path.expanduser(os.path.expandvars(sys.argv[2]))) 
    else: 
     bakfolder = BAKFOLDER 

    if os.path.isdir(tree_top): 
     backup_files(tree_top, bakfolder) 
+1

いいえ、特定の質問をしてください。何をすべきか?このプログラム全体を1行ずつ調べますか? 'pdb'を使ってコードを進めることができます。 – Falmarri

+1

違反はありませんが、誰もあなたにコードの完全な説明を与えるつもりはありません。まず自分で試してみて、明確でないものだけを尋ねなければなりません。 – user225312

+0

疑問がある場合は、http://docs.python.org/ – Skurmedel

答えて

3

スクリプトは再帰的にバックアップディレクトリにディレクトリの内容(カレントディレクトリデフォルト)をコピーしようとすると(.BAKデフォルト現在のディレクトリに);

各filename.extに対して、filename.ext.00という名前の複製が作成されます。 filename.ext.00が既に存在する場合は、代わりにfilename.ext.01を作成します。

xrange()は0(MAXVERSION-1)のすべての数値を返すジェネレータであるため、MAXVERSIONは試用するバージョンサフィックスの数、つまり保存するファイルの古いバージョンの数を制御します。