Created
December 8, 2009 18:45
-
-
Save tstone/251883 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# 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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment