2011-02-05 96 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

編號提出具體問題。我們究竟應該做什麼?逐行瀏覽整個程序?使用`pdb`,你可以遍歷代碼。 – Falmarri 2011-02-05 11:15:57

回答

3

腳本嘗試遞歸複製目錄中的內容(默認爲當前目錄)到一個備份目錄(默認爲.bak在當前目錄中);

對於每個filename.ext,它創建一個名爲filename.ext.00的重複;如果filename.ext.00已經存在,它會創建filename.ext.01,等等。 xrange()是一個返回0 ..(MAXVERSION-1)中所有數字的生成器,所以MAXVERSION控制要嘗試多少版本後綴,即要保留多少箇舊版本的文件。