| #!/usr/bin/env python3 |
| # |
| # Allow copying of $1 to $2 but if files in $1 disappear during the copy operation, |
| # don't error. |
| # Also don't error if $1 disappears. |
| # |
| |
| import sys |
| import os |
| import shutil |
| |
| def copytree(src, dst, symlinks=False, ignore=None): |
| """Based on shutil.copytree""" |
| names = os.listdir(src) |
| try: |
| os.makedirs(dst) |
| except OSError: |
| # Already exists |
| pass |
| errors = [] |
| for name in names: |
| srcname = os.path.join(src, name) |
| dstname = os.path.join(dst, name) |
| try: |
| d = dstname |
| if os.path.isdir(dstname): |
| d = os.path.join(dstname, os.path.basename(srcname)) |
| if os.path.exists(d): |
| continue |
| try: |
| os.link(srcname, dstname) |
| except OSError: |
| shutil.copy2(srcname, dstname) |
| # catch the Error from the recursive copytree so that we can |
| # continue with other files |
| except shutil.Error as err: |
| errors.extend(err.args[0]) |
| except EnvironmentError as why: |
| errors.append((srcname, dstname, str(why))) |
| try: |
| shutil.copystat(src, dst) |
| except OSError as why: |
| errors.extend((src, dst, str(why))) |
| if errors: |
| raise shutil.Error(errors) |
| |
| try: |
| copytree(sys.argv[1], sys.argv[2]) |
| except shutil.Error: |
| pass |
| except OSError: |
| pass |