Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # A python module to implement recursive search/copy of files
- #
- import datetime
- import shutil
- import os
- import re
- class DirSearch(object):
- def __init__(self, dir, show_output=False):
- self.source = dir
- self.show_output = show_output
- def search(self, callback, filter=None, changed_date=None):
- """
- Recursively searches a directory. If regex is given, includes only those files which match.
- dir - Root directory to search from
- callback - Method to be called for each file found
- filter - Paths matching this regex will not be included
- changed_date - Any files modified after this date will be included
- """
- self._searcher(self.source, callback, filter, changed_date)
- def replicate(self, dest, filter=None, changed_date=None):
- """
- Recursively copies self directory to the given destination.
- filter - Paths matching this regex will not be included
- changed_date - Any files modified after this date will be included
- """
- self.dest = dest
- self.search(self._replicate_handler, filter, changed_date)
- def _searcher(self, source, callback, filter, changed_date):
- dir = os.path.abspath(source)
- for file in [file for file in os.listdir(dir) if not file in [".",".."]]:
- item = os.path.join(dir, file)
- skip = False
- # Regex path filter
- if filter:
- if re.search(filter, item, re.IGNORECASE):
- skip = True
- if os.path.isdir(item):
- if not skip:
- self._searcher(item, callback, filter, changed_date)
- else:
- if changed_date and not skip:
- # Modification date fitler
- mod_time = datetime.datetime.fromtimestamp(os.path.getmtime(item))
- if mod_time < changed_date:
- skip = True
- if not skip:
- callback(item)
- def _replicate_handler(self, file):
- # Check if parent directory exists
- dest_file = self._path_source_to_dest(file)
- parent_dir = os.path.dirname(dest_file)
- if not os.path.exists(parent_dir):
- self._recursive_mkdir(parent_dir)
- pass
- # Copy over file
- if file.find('Thumbs.db') == -1:
- shutil.copyfile(file, dest_file)
- if self.show_output:
- print 'Copied %s' % dest_file
- def _path_source_to_dest(self, path):
- # Standardize slashes
- path = path.replace('\\', '|').replace('/', '|')
- source = self.source.replace('\\', '|').replace('/', '|')
- # Parse path
- relative_path = path.replace(source, '').replace('|', '\\')
- return self.dest + relative_path
- def _recursive_mkdir(self, path):
- parent = os.path.dirname(path)
- if not os.path.exists(parent):
- self._recursive_mkdir(parent)
- os.mkdir(path)
- else:
- os.mkdir(path)
Add Comment
Please, Sign In to add comment