regular expressions and renaming files

François Pinard pinard at iro.umontreal.ca
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 iro.umontreal.ca>, 1991, 2004.
# D'après Tom Christiansen <tchrist at convex.com>, alt.sources 1990-12-08.

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

Usage: rename [OPTION]... TRANSFORMATION FICHIER...

Options:
    -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'.

Exemples:
    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:
        sys.stdout.write(__doc__)
        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
        try:
            _ = eval(operation)
        except SyntaxError:
            exec operation
        if _ != argument:
            try:
                os.rename(argument, _)
            except IOError, diagnostic:
                sys.stderr.write('* %s: %s\n' % (argument, diagnostic))
            else:
                if verbeux:
                    sys.stderr.write('%s -> %s\n' % (argument, _))

if __name__ == '__main__':
    main(*sys.argv[1:])

-- 
François Pinard   http://www.iro.umontreal.ca/~pinard




More information about the Python-list mailing list