2012-05-19 19 views
20

que busco una manera de cambiar el nombre de lote de archivos con una expresión regular es decirexpresión regular para renombrar archivos por lotes en OS X Terminal

s/123/onetwothree/g 

Recuerdo que puedo usar awk y sed con una expresión regular, pero no podía encontrar la manera de pídalos juntos para la salida deseada.

+0

Solo quería agradecerle a ccpizza ya que el script de Python Regex funcionó muy bien para mí. Habría votado, pero soy novato, así que no puedo ... no puedo hacer mucho ... ni siquiera puedo comentar. Utilicé su script de Python en mi MacBook Pro para renombrar una carga de archivos con grupos de captura, por lo que no perdí ninguna información vital y pude cambiar los nombres de los archivos a un formato más aceptable. ¡Estoy comenzando con Python pero me encanta Regex y este guión funcionó muy bien para mí! – NutSoft

Respuesta

19

Una forma eficiente de realizar la operación de cambio de nombre es construir los comandos de cambio de nombre en una tubería sed y alimentarlos en el caparazón.

ls | 
sed -n 's/\(.*\)\(123\)\(.*\)/mv "\1\2\3" "\1onetwothree\2"/p' | 
sh 
+0

El \ 2 después de onetwothree debería ser \ 3 – Cong

+0

Lo único que funcionó recursivamente (con el uso del comando find) '$ find. -imame test * | sed -E 's /\.\/ (test) (. *) (\. jpg)/mv \ 1 \ 2 \ 3 \ 1 \ 214 \ 3 /' | sh' – Binarian

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

Puede instalar Perl utilidad de cambio de nombre en base:

brew install rename 

y que sólo lo utilizan como:

rename 's/123/onetwothree/g' * 

si desea probar su expresión regular sin cambiar el nombre de los archivos solo add -n switch

1

Mi opinión sobre un nombre recursivo amistoso regex nombre de archivo renamer que por defecto solamente emula prueba el reemplazo y muestra cuáles serían los nombres de archivos resultantes.

Use -w para escribir realmente los cambios cuando esté satisfecho con el resultado de ejecución en seco, -s para suprimir la visualización de los archivos que no coincidan; -h o --help mostrará notas de uso. el uso

más simple:

# 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 

grupos de simulación (por ejemplo, \1\2 etc) son compatibles también:

# rename "spam.txt" to "spam.py" 
ren.py . '(.+)\.txt' '\1.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})' '\2-\1.\3' -s 

NOTA: No se olvide de añadir -w cuando se puso a prueba la resultados y desea realmente escribir los cambios.

Funciona tanto con Python 2.x como con 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) 
Cuestiones relacionadas