
Uno de mis clientes es una escuela. En su servidor de archivos, todos los proyectos tienen un directorio con el mismo esquema de nombres.
<apellido>, <nombre> <segundo nombre>? - <descripción del proyecto>
Por ejemplo:
Miller, John Andrew - Descripción larga del proyecto Willis, Bruce - Descripción, quizás con coma Lewis, Mary-Jane - Descripción - Incluye menos
La nueva convención de nomenclatura es:
<nombre> <segundo nombre>? <apellido> - <descripción del proyecto>
Por ejemplo:
John Andrew Miller - Descripción larga del proyecto Bruce Willis - Descripción, quizás con coma Mary-Jane Lewis - Descripción - Incluyendo menos
Ahora, ¿cómo cambiar el nombre por lotes de todas las carpetas existentes a la nueva convención?
Respuesta1
Dado que la parte de descripción del nombre del archivo puede contener el patrón -
(un guión entre dos espacios), puede cambiarlo por algún símbolo quenoocurren en la parte de descripción. Elegí £
, pero eso es puramente arbitrario.
rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *
s/ - /£/' tells rename to replace the first instance of
- it finds with
£ . The second command is a bit more complicated. Parenthases (
() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as
$1 (all the way up to
$9 ).
[^,] means 'any character, except for
,';
means 'zero or more of the previous character';
[^,]` significa 'cero o más de cualquier carácter excepto una coma'. Dado que el cambio de nombre es codicioso de forma predeterminada, coincide con la cadena más larga posible.
El resto, creo, se produce de forma bastante natural.
Si no está seguro de si aparece un símbolo en alguna parte del nombre del archivo, simplemente ejecute:
printf '%s\n' *£*
Si tienes perl-rename:
rename 's/([^,]*), (.*) - /$2 $1 - /' *
Esto se romperá si la parte de descripción de los nombres de archivo contiene -
(es decir, un -
espacio entre dos espacios).
Deberías probar esto con la -n
bandera, que no cambiará el nombre de ningún archivo, pero mostrará lo queharíahaber hecho:
rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
Respuesta2
En lo que respecta a la combinación, habría que tener mucho cuidado para poder construir algo sólido. Por ejemplo, suponiendo que el primer y segundo nombre
- debe comenzar con una letra
- puede contener guiones (pero no otros signos de puntuación ni espacios en blanco)
el patrón de su nombre de pila se convierte en algo así como [[:alpha:]][[:alpha:]-]*
. Luego puede crear un segundo nombre opcional separado por espacios, ((?: [[:alpha:]][[:alpha:]-]*)?)
donde la estructura de grupo adicional que no captura solo ayuda a mantener los números del grupo de captura rectos cuando el segundo nombre está vacío. Juntándolo, por ejemplo, usando el comando de cambio de nombre basado en Perl
rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
o (permitiendo espacios en blanco más generales entre los campos en lugar de espacios individuales)
rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
El -n
cambio no es operativo, es decir, en realidad no realizará cambios de nombre hasta que se elimine. Si no tiene el cambio de nombre basado en Perl, puede usar una combinación de perl
y mv
.