Skip to content

Instantly share code, notes, and snippets.

@tstone
Created December 8, 2009 18:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tstone/251883 to your computer and use it in GitHub Desktop.
Save tstone/251883 to your computer and use it in GitHub Desktop.
#
# 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