Home | History | Annotate | Download | only in Mac
      1 """Recursively copy a directory but skip undesired files and
      2 directories (CVS, backup files, pyc files, etc)"""
      3 
      4 import sys
      5 import os
      6 import shutil
      7 
      8 verbose = 1
      9 debug = 0
     10 
     11 def isclean(name):
     12     if name == 'CVS': return 0
     13     if name == '.cvsignore': return 0
     14     if name == '.DS_store': return 0
     15     if name == '.svn': return 0
     16     if name.endswith('~'): return 0
     17     if name.endswith('.BAK'): return 0
     18     if name.endswith('.pyc'): return 0
     19     if name.endswith('.pyo'): return 0
     20     if name.endswith('.orig'): return 0
     21     return 1
     22 
     23 def copycleandir(src, dst):
     24     for cursrc, dirs, files in os.walk(src):
     25         assert cursrc.startswith(src)
     26         curdst = dst + cursrc[len(src):]
     27         if verbose:
     28             print("mkdir", curdst)
     29         if not debug:
     30             if not os.path.exists(curdst):
     31                 os.makedirs(curdst)
     32         for fn in files:
     33             if isclean(fn):
     34                 if verbose:
     35                     print("copy", os.path.join(cursrc, fn), os.path.join(curdst, fn))
     36                 if not debug:
     37                     shutil.copy2(os.path.join(cursrc, fn), os.path.join(curdst, fn))
     38             else:
     39                 if verbose:
     40                     print("skipfile", os.path.join(cursrc, fn))
     41         for i in range(len(dirs)-1, -1, -1):
     42             if not isclean(dirs[i]):
     43                 if verbose:
     44                     print("skipdir", os.path.join(cursrc, dirs[i]))
     45                 del dirs[i]
     46 
     47 def main():
     48     if len(sys.argv) != 3:
     49         sys.stderr.write("Usage: %s srcdir dstdir\n" % sys.argv[0])
     50         sys.exit(1)
     51     copycleandir(sys.argv[1], sys.argv[2])
     52 
     53 if __name__ == '__main__':
     54     main()
     55