Busco una manera de cambiar el nombre de archivos por lotes con una expresión regular es decir,

s/123/onetwothree/g

Recuerdo puedo usar awk y sed con una expresión regular, pero no podía entender cómo la tubería de la salida deseada.

  • Solo quería agradecer ccpizza como el Python regex guión trabajado muy bien para mí. Me hubiera upvoted pero soy un novato, así que no puede… no se puede hacer mucho… incluso no se puede comentar. He utilizado su secuencia de comandos de Python en mi MacBook Pro para cambiar el nombre de una carga de archivos con la captura de los grupos, así que no pierda ninguna información vital y yo era capaz de cambiar los nombres de archivo en un formato aceptable. Sólo estoy empezando con Python, pero el amor regex y este script funcionó muy bien para mí!
InformationsquelleAutor user370507 | 2012-05-19

5 Comentarios

  1. 19

    De una manera eficiente de realizar la operación de cambio de nombre es para construir el cambiar el nombre de los comandos en una sed de canalización y piensos en el shell.

    ls |
    sed -n 's/\(.*\)\(123\)\(.*\)/mv "" "onetwothree"/p' |
    sh
    • El \2 después de onetwothree debe ser \3
    • Lo único que trabajó de forma recursiva (usando el comando find) $ find . -iname test* | sed -E 's/\.\/(test)(.*)(\.jpg)/mv \1\2\3 \1\214\3/' | sh
  2. 71

    Puede instalar perl basado rename utility:

    brew install rename

    y que sólo lo utilizan como:

    rename 's/123/onetwothree/g' *

    si quieres poner a prueba tu regex sin cambio de nombre de los archivos que acaba de agregar -n interruptor de

  3. 5
    files = "*"
    for f in $files; do
         newname=`echo "$f" | sed 's/123/onetwothree/g'`
         mv "$f" "$newname"
    done
  4. 4

    Mi opinión sobre un amistoso recursiva regex nombre de archivo renamer que, por defecto, sólo emula el reemplazo y muestra lo que el archivo resultante de nombres.

    Uso -w para escribir los cambios cuando esté satisfecho con el funcionamiento en seco del resultado, -s para suprimir la visualización de la no-coincidencia de archivos; -h o --help se muestran notas de uso.

    Más simple de uso:

    # replace all occurences of 'foo' with 'bar'
    # "foo-foo.txt" >> "bar-bar.txt"
    ren.py . 'foo' 'bar' -s
    
    # only replace 'foo' at the beginning of the filename
    # "foo-foo.txt" >> "bar-foo.txt"
    ren.py . '^foo' 'bar' -s

    La coincidencia de los grupos (por ejemplo,\1, \2 etc) son compatibles también:

    # rename "spam.txt" to "spam-spam-spam.py"
    ren.py . '(.+)\.txt' '--.py' -s 
    
    # rename "12-lovely-spam.txt" to "lovely-spam-12.txt"
    # (assuming two digits at the beginning and a 3 character extension 
    ren.py . '^(\d{2})-(.+)\.(.{3})' '-.' -s

    NOTA: no te olvides de añadir -w cuando probó los resultados y desea escribir los cambios.

    Funciona tanto con Python 2.x y Python 3.x.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import print_function
    import argparse
    import os
    import fnmatch
    import sys
    import shutil
    import re
    def rename_files(args):
    pattern_old = re.compile(args.search_for)
    for path, dirs, files in os.walk(os.path.abspath(args.root_folder)):
    for filename in fnmatch.filter(files, "*.*"):
    if pattern_old.findall(filename):
    new_name = pattern_old.sub(args.replace_with, filename)
    filepath_old = os.path.join(path, filename)
    filepath_new = os.path.join(path, new_name)
    if not new_name:
    print('Replacement regex {} returns empty value! Skipping'.format(args.replace_with))
    continue
    print(new_name)
    if args.write_changes:
    shutil.move(filepath_old, filepath_new)
    else:
    if not args.suppress_non_matching:
    print('Name [{}] does not match search regex [{}]'.format(filename, args.search_for))
    if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Recursive file name renaming with regex support')
    parser.add_argument('root_folder',
    help='Top folder for the replacement operation',
    nargs='?',
    action='store',
    default='.')
    parser.add_argument('search_for',
    help='string to search for',
    action='store')
    parser.add_argument('replace_with',
    help='string to replace with',
    action='store')
    parser.add_argument('-w', '--write-changes',
    action='store_true',
    help='Write changes to files (otherwise just simulate the operation)',
    default=False)
    parser.add_argument('-s', '--suppress-non-matching',
    action='store_true',
    help='Hide files that do not match',
    default=False)
    args = parser.parse_args(sys.argv[1:])
    print(args)
    rename_files(args)
    • Gracias @ccpizza. Trabajó mucho con Python 3 en Windows 10.

Dejar respuesta

Please enter your comment!
Please enter your name here