Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Mac/Extras.install.py
12 views
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 in ('CVS', '.cvsignore', '.svn'):
13
return 0
14
if name.lower() == '.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
22
def copycleandir(src, dst):
23
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
46
def main():
47
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
52
if __name__ == '__main__':
53
main()
54
55