Copying and merging directories excluding certain extensions Copying and merging directories excluding certain extensions windows windows

Copying and merging directories excluding certain extensions


As PeterBrittain suggested, writing my own version of shutil.copytree() was the way to go. Below is the code. Note that the only difference is the wrapping of the os.makedirs() in an if block.

from shutil import copy2, copystat, Error, ignore_patternsimport osdef copytree_multi(src, dst, symlinks=False, ignore=None):    names = os.listdir(src)    if ignore is not None:        ignored_names = ignore(src, names)    else:        ignored_names = set()    # -------- E D I T --------    # os.path.isdir(dst)    if not os.path.isdir(dst):        os.makedirs(dst)    # -------- E D I T --------    errors = []    for name in names:        if name in ignored_names:            continue        srcname = os.path.join(src, name)        dstname = os.path.join(dst, name)        try:            if symlinks and os.path.islink(srcname):                linkto = os.readlink(srcname)                os.symlink(linkto, dstname)            elif os.path.isdir(srcname):                copytree_multi(srcname, dstname, symlinks, ignore)            else:                copy2(srcname, dstname)        except (IOError, os.error) as why:            errors.append((srcname, dstname, str(why)))        except Error as err:            errors.extend(err.args[0])    try:        copystat(src, dst)    except WindowsError:        pass    except OSError as why:        errors.extend((src, dst, str(why)))    if errors:        raise Error(errors)


if you do want to use shutil directly, here's a hot patch for os.makedirs to skip the error.

import osos_makedirs = os.makedirsdef safe_makedirs(name, mode=0777):    if not os.path.exists(name):        os_makedirs(name, mode)os.makedirs = safe_makedirsimport shutildirs_to_copy = [r'J:\Data\Folder_A', r'J:\Data\Folder_B']destination_dir = r'J:\Data\DestinationFolder'if os.path.exists(destination_dir):    shutil.rmtree(destination_dir)for files in dirs_to_copy:    shutil.copytree(files, destination_dir, ignore=shutil.ignore_patterns("*.abc")) code here