def regex_rename(top, pattern, repl, maxdepth=None): '''Rename files recursively using regular expressions substitution. :param top: The top directory to start walking. :param pattern: A regular expression pattern. Files whose fullname (including the path) match the expression will be renamed. :param repl: String to use as replacement. You may use backreferences as documented in python's ``re.sub`` function. :param maxdepth: Only walk files up to this level. If None, walk all files. .. versionadded:: 1.2.1 ''' from re import subn as _re_subn from xoutil.eight import string_types if isinstance(pattern, string_types): pattern = _rcompile(pattern) depth = 0 for path, _dirs, files in os.walk(top): for item in files: new_file, count = _re_subn(pattern, repl, item) if count > 0: old = os.path.join(path, item) new = os.path.join(path, new_file) os.rename(old, new) if maxdepth is not None: depth += 1 if depth >= maxdepth: _dirs[:] = []
def iter_dict_files(top='.', regex=None, wrong=None, followlinks=False): ''' Iterate filenames recursively. :param top: The top directory for recurse into. :param regex: Regular expression with group definitions to match. :param wrong: A key to store full name of not matching files. :param followlinks: The same meaning that in `os.walk`. .. versionadded:: 1.2.1 .. versionadded:: 1.2.0 ''' if regex: from xoutil.eight import string_types if isinstance(regex, string_types): regex = _rcompile(regex) else: regex = _REGEX_DEFAULT_ALLFILES for dirpath, _dirs, filenames in os.walk(normalize_path(top), followlinks=followlinks): for filename in filenames: path = os.path.join(dirpath, filename) match = regex.match(path) if match: yield match.groupdict() elif wrong is not None: yield {wrong: path}
def get_regex_filter(regex): '''Return a filter for "walk" based on a regular expression.''' if isinstance(regex, string_types): regex = _rcompile(regex) def _filter(path, stat_info): return regex.match(os.path.basename(path)) is not None return _filter
def _get_regex(pattern=None, regex_pattern=None, shell_pattern=None): from functools import reduce import fnmatch arg_count = reduce(lambda count, p: count + (1 if p is not None else 0), (pattern, regex_pattern, shell_pattern), 0) if arg_count == 1: if pattern is not None: if pattern.startswith('(?') or pattern.startswith('^(?'): regex_pattern = pattern else: shell_pattern = pattern return _rcompile(regex_pattern or fnmatch.translate(shell_pattern)) elif arg_count == 0: return None else: raise TypeError('"_get_regex()" takes at most 1 argument ' '(%s given)' % arg_count)
''' from __future__ import (division as _py3_division, print_function as _py3_print, unicode_literals as _py3_unicode, absolute_import as _py3_abs_import) import sys import os from re import compile as _rcompile from xoutil.fs.path import normalize_path re_magic = _rcompile('[*?[]') has_magic = lambda s: re_magic.search(s) is not None def _get_regex(pattern=None, regex_pattern=None, shell_pattern=None): from functools import reduce import fnmatch arg_count = reduce(lambda count, p: count + (1 if p is not None else 0), (pattern, regex_pattern, shell_pattern), 0) if arg_count == 1: if pattern is not None: if pattern.startswith('(?') or pattern.startswith('^(?'): regex_pattern = pattern else: shell_pattern = pattern return _rcompile(regex_pattern or fnmatch.translate(shell_pattern))