regular expressions and renaming files

François Pinard pinard at
Wed Feb 18 23:01:14 CET 2004

[David Lebel]

> One script I had in my toolbox was used to rename files using a
> regular expression.  That script came from Tom Christiansen (of Perl
> fame) and shows the great flexibility of Perl doing regular expression
> operations.  Now, I don't know where to start doing the conversion.

Here is my cut of it, from my personal toolbox (so the French comments).
I submit it here in case people would suggest improvements... :-)

#!/usr/bin/env python
# -*- coding: Latin-1 -*-
# François Pinard <pinard at>, 1991, 2004.
# D'après Tom Christiansen <tchrist at>, alt.sources 1990-12-08.

Renommer les fichiers selon un thème de transformation fourni.


    -v   Décrire les changements effectués.

TRANSFORMATION doit être, soit une expression Python qui évalue le
nouveau nom pour le fichier dont le nom est fourni initialement dans
`_', soit un énoncé Python qui affecte à la variable `_' le nouveau nom
pour le fichier dont le nom est initialement contenu dans `_'.

On peut compter sur les modules `os', `re' et `sys'.

    rename '_[:-5]' *.orig
    rename -v 'if not _.startswith("Make"): _ = _.lower()' *
    rename '_ + ".bad"' *.f
    rename 'if _[0] in "yY": print _; _ = _.replace("foo", "bar")' *

import os, re, sys

def main(*arguments):
    if not arguments:
        raise SystemExit
    assert len(arguments) < 2, arguments
    verbeux = False
    import getopt
    options, arguments = getopt.getopt(arguments, 'v')
    for option, valeur in options:
        if option == '-v':
            verbeux = True
    operation = arguments[0]
    for argument in arguments[1:]:
        _ = argument
            _ = eval(operation)
        except SyntaxError:
            exec operation
        if _ != argument:
                os.rename(argument, _)
            except IOError, diagnostic:
                sys.stderr.write('* %s: %s\n' % (argument, diagnostic))
                if verbeux:
                    sys.stderr.write('%s -> %s\n' % (argument, _))

if __name__ == '__main__':

François Pinard

More information about the Python-list mailing list