blob: 2521f06a655a8119f06a79b4352403d39de19295 [file] [log] [blame]
Jack Jansena1b77582003-06-19 22:35:20 +00001"""Recursively copy a directory but skip undesired files and
2directories (CVS, backup files, pyc files, etc)"""
3
4import sys
5import os
6import shutil
7
8verbose = 1
9debug = 0
10
11def isclean(name):
Tim Peters182b5ac2004-07-18 06:16:08 +000012 if name == 'CVS': return 0
13 if name == '.cvsignore': return 0
14 if name == '.DS_store': return 0
15 if name.endswith('~'): return 0
16 if name.endswith('.BAK'): return 0
17 if name.endswith('.pyc'): return 0
18 if name.endswith('.pyo'): return 0
19 if name.endswith('.orig'): return 0
20 return 1
21
Jack Jansena1b77582003-06-19 22:35:20 +000022def copycleandir(src, dst):
Tim Peters182b5ac2004-07-18 06:16:08 +000023 for cursrc, dirs, files in os.walk(src):
24 assert cursrc.startswith(src)
25 curdst = dst + cursrc[len(src):]
26 if verbose:
27 print "mkdir", curdst
28 if not debug:
29 if not os.path.exists(curdst):
30 os.makedirs(curdst)
31 for fn in files:
32 if isclean(fn):
33 if verbose:
34 print "copy", os.path.join(cursrc, fn), os.path.join(curdst, fn)
35 if not debug:
36 shutil.copy2(os.path.join(cursrc, fn), os.path.join(curdst, fn))
37 else:
38 if verbose:
39 print "skipfile", os.path.join(cursrc, fn)
40 for i in range(len(dirs)-1, -1, -1):
41 if not isclean(dirs[i]):
42 if verbose:
43 print "skipdir", os.path.join(cursrc, dirs[i])
44 del dirs[i]
45
Jack Jansena1b77582003-06-19 22:35:20 +000046def main():
Tim Peters182b5ac2004-07-18 06:16:08 +000047 if len(sys.argv) != 3:
48 sys.stderr.write("Usage: %s srcdir dstdir\n" % sys.argv[0])
49 sys.exit(1)
50 copycleandir(sys.argv[1], sys.argv[2])
51
Jack Jansena1b77582003-06-19 22:35:20 +000052if __name__ == '__main__':
Tim Peters182b5ac2004-07-18 06:16:08 +000053 main()