cp-noerror 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env python
  2. #
  3. # Allow copying of $1 to $2 but if files in $1 disappear during the copy operation,
  4. # don't error.
  5. # Also don't error if $1 disappears.
  6. #
  7. import sys
  8. import os
  9. import shutil
  10. def copytree(src, dst, symlinks=False, ignore=None):
  11. """Based on shutil.copytree"""
  12. names = os.listdir(src)
  13. try:
  14. os.makedirs(dst)
  15. except OSError:
  16. # Already exists
  17. pass
  18. errors = []
  19. for name in names:
  20. srcname = os.path.join(src, name)
  21. dstname = os.path.join(dst, name)
  22. try:
  23. d = dstname
  24. if os.path.isdir(dstname):
  25. d = os.path.join(dstname, os.path.basename(srcname))
  26. if os.path.exists(d):
  27. continue
  28. try:
  29. os.link(srcname, dstname)
  30. except OSError:
  31. shutil.copy2(srcname, dstname)
  32. # catch the Error from the recursive copytree so that we can
  33. # continue with other files
  34. except shutil.Error, err:
  35. errors.extend(err.args[0])
  36. except EnvironmentError, why:
  37. errors.append((srcname, dstname, str(why)))
  38. try:
  39. shutil.copystat(src, dst)
  40. except OSError, why:
  41. errors.extend((src, dst, str(why)))
  42. if errors:
  43. raise shutil.Error, errors
  44. try:
  45. copytree(sys.argv[1], sys.argv[2])
  46. except shutil.Error:
  47. pass
  48. except OSError:
  49. pass