Guest User

Untitled

a guest
Apr 25th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. #
  2. # A python module to implement recursive search/copy of files
  3. #
  4.  
  5. import datetime
  6. import shutil
  7. import os
  8. import re
  9.  
  10. class DirSearch(object):
  11.  
  12. def __init__(self, dir, show_output=False):
  13. self.source = dir
  14. self.show_output = show_output
  15.  
  16. def search(self, callback, filter=None, changed_date=None):
  17. """
  18. Recursively searches a directory. If regex is given, includes only those files which match.
  19. dir - Root directory to search from
  20. callback - Method to be called for each file found
  21. filter - Paths matching this regex will not be included
  22. changed_date - Any files modified after this date will be included
  23. """
  24. self._searcher(self.source, callback, filter, changed_date)
  25.  
  26. def replicate(self, dest, filter=None, changed_date=None):
  27. """
  28. Recursively copies self directory to the given destination.
  29. filter - Paths matching this regex will not be included
  30. changed_date - Any files modified after this date will be included
  31. """
  32. self.dest = dest
  33. self.search(self._replicate_handler, filter, changed_date)
  34.  
  35. def _searcher(self, source, callback, filter, changed_date):
  36. dir = os.path.abspath(source)
  37. for file in [file for file in os.listdir(dir) if not file in [".",".."]]:
  38. item = os.path.join(dir, file)
  39. skip = False
  40.  
  41. # Regex path filter
  42. if filter:
  43. if re.search(filter, item, re.IGNORECASE):
  44. skip = True
  45.  
  46. if os.path.isdir(item):
  47. if not skip:
  48. self._searcher(item, callback, filter, changed_date)
  49. else:
  50. if changed_date and not skip:
  51. # Modification date fitler
  52. mod_time = datetime.datetime.fromtimestamp(os.path.getmtime(item))
  53. if mod_time < changed_date:
  54. skip = True
  55.  
  56. if not skip:
  57. callback(item)
  58.  
  59. def _replicate_handler(self, file):
  60. # Check if parent directory exists
  61. dest_file = self._path_source_to_dest(file)
  62. parent_dir = os.path.dirname(dest_file)
  63.  
  64. if not os.path.exists(parent_dir):
  65. self._recursive_mkdir(parent_dir)
  66. pass
  67.  
  68. # Copy over file
  69. if file.find('Thumbs.db') == -1:
  70. shutil.copyfile(file, dest_file)
  71. if self.show_output:
  72. print 'Copied %s' % dest_file
  73.  
  74. def _path_source_to_dest(self, path):
  75. # Standardize slashes
  76. path = path.replace('\\', '|').replace('/', '|')
  77. source = self.source.replace('\\', '|').replace('/', '|')
  78. # Parse path
  79. relative_path = path.replace(source, '').replace('|', '\\')
  80. return self.dest + relative_path
  81.  
  82. def _recursive_mkdir(self, path):
  83. parent = os.path.dirname(path)
  84. if not os.path.exists(parent):
  85. self._recursive_mkdir(parent)
  86. os.mkdir(path)
  87. else:
  88. os.mkdir(path)
Add Comment
Please, Sign In to add comment