# Module 'shutil' -- utility functions usable in a shell-like program import posix import path MODEBITS = 010000 # Lower 12 mode bits # Change this to 01000 (9 mode bits) to avoid copying setuid etc. # Copy data from src to dst # def copyfile(src, dst): fsrc = open(src, 'r') fdst = open(dst, 'w') while 1: buf = fsrc.read(16*1024) if not buf: break fdst.write(buf) # Copy mode bits from src to dst # def copymode(src, dst): st = posix.stat(src) mode = divmod(st[0], MODEBITS)[1] posix.chmod(dst, mode) # Copy all stat info (mode bits, atime and mtime) from src to dst # def copystat(src, dst): st = posix.stat(src) mode = divmod(st[0], MODEBITS)[1] posix.chmod(dst, mode) posix.utimes(dst, st[7:9]) # Copy data and mode bits ("cp src dst") # def copy(src, dst): copyfile(src, dst) copymode(src, dst) # Copy data and all stat info ("cp -p src dst") # def copy2(src, dst): copyfile(src, dst) copystat(src, dst) # Recursively copy a directory tree. # The destination must not already exist. # def copytree(src, dst): names = posix.listdir(src) posix.mkdir(dst, 0777) dot_dotdot = '.', '..' for name in names: if name not in dot_dotdot: srcname = path.join(src, name) dstname = path.join(dst, name) #print 'Copying', srcname, 'to', dstname try: #if path.islink(srcname): # linkto = posix.readlink(srcname) # posix.symlink(linkto, dstname) #elif path.isdir(srcname): if path.isdir(srcname): copytree(srcname, dstname) else: copy2(srcname, dstname) # XXX What about devices, sockets etc.? except posix.error, why: print 'Could not copy', srcname, 'to', dstname, print '(', why[1], ')'