title: Backup Script in Python
body: <p>can some one please provide me with an explanation of the code especially the use of maxversions and statements following the line "for f in files:".</p>
  
  <p>I want to understand what <code>xrange(MAXVERSION)</code> means? What is the use of indexing i.e </p>
  
  <pre><code>for index in xrange(MAXVERSIONS): backup = '%s.%2.2d' % (destpath, index) 
  </code></pre>
  
  <p>The code:</p>
  
  <pre><code>!/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 &gt; 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)&lt;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)&gt;=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)
  </code></pre>