Estaba buscando una manera de cambiar el nombre de una gran cantidad de archivos con nombres similares , como este (una pregunta relacionada con Windows), excepto que estoy usando * nix (Ubuntu y FreeBSD, por separado). Solo para resumir, mientras uso el shell (Bash, CSH, etc.), ¿cómo cambio el nombre en masa de una cantidad de archivos tales como, por ejemplo, los siguientes archivos:
Beethoven - Fur Elise.mp3
Beethoven - Moonlight Sonata.mp3
Beethoven - Oda a la Alegría.mp3
Beethoven - Rage Over the Lost Penny.mp3
será renombrado como estos?
Fur Elise.mp3
Moonlight Sonata.mp3
Oda a la alegría.mp3
Rage Over the Lost Penny.mp3
La razón por la que quiero hacer esto es que esta colección de archivos irá bajo un directorio llamado "Beethoven" (es decir, el prefijo de los nombres de archivo), y tener esta información en el nombre del archivo será redundante.
Como tantas otras cosas con Linux / Unix, ¡hay más de una forma de hacerlo!
Algunos pueden usar mmv (mv de masa).
El comando rename o prename que viene con algunos paquetes de Perl (Ubuntu y Debian más nuevos) también puede hacer esto.
Tenga en cuenta que la herramienta de cambio de nombre en Fedora 10 no es el mismo programa que este y funciona de manera diferente. Es parte de un paquete diferente, util-linux-ng y se puede encontrar aquí .
A menudo solo voy al shell por bucle por costumbre (después de todas esas herramientas no siempre existieron).
Esto creará el directorio de Beethoven, luego moverá el archivo a ese directorio / nombre de archivo, donde el nombre de archivo tiene el "Beethoven -" reemplazado por nada.
Como prueba, antes:
Después:
fuente
Pruebe esta solución, implementada usando una combinación de grep y renombrar. Esto supone que tiene un montón de directorios que necesita cambiar de nombre. Si solo hay unos pocos, seguiría el enfoque manual, con el patrón "Artista -" codificado para cada uno.
Explicación de find :
el comando find encuentra todos los archivos con extensión .mp3 en la jerarquía de archivos actual y llama al argumento pasado a -exec para cada uno. Tenga en cuenta que dentro de -exec , {} se refiere al argumento pasado por find (ruta del archivo + nombre). Las
\;
asegura que el;
se transfieren a cambiar el nombre y el lugar de indicar el final del hallazgo de comandos.El comando dado anteriormente tiene el modificador -n (sin acción); por lo tanto, solo le dirá qué sucedería si lo ejecutara. Le recomiendo que ejecute este comando sin el modificador -n solo después de haberlo ejecutado una vez y esté satisfecho con los resultados propuestos.
Ahora para la expresión regular.
^
coincide con el inicio de la cadena.$
coincide con el final de la cadena..
coincide con cualquier personaje.*
significa cero o más de la construcción anterior. Por ejemplo,.*
significa cero o más caracteres.\s
representa cualquier personaje espacial.\S
significa cualquier personaje que no sea espacial.()
es capturado y se refleja como$1
,$2
en función de su posición.La expresión regular:
(.*/)
-
":.*-
(.*)
Aquí está mi prueba de funcionamiento:
Las expresiones regulares son un asunto complicado, y he cometido muchos errores al escribirlas, por lo que agradecería cualquier comentario sobre la falta de mérito de este. Sé que encontré bastantes pruebas de esto.
fuente
He creado un programa Java de línea de comandos que facilita el cambio de nombre de los archivos (y directorios), especialmente para las secuencias de comandos. Es gratuito y de código abierto, por lo que puede modificarlo al contenido de su corazón:
RenameWand
http://renamewand.sourceforge.net/
Algunos ejemplos de uso relevantes:
Mueva los archivos del formulario
"<a> - <b>"
a su directorio respectivo"<a>"
:Ordene los archivos por hora de última modificación y cámbieles el nombre con un número de 3 dígitos:
Reorganizar partes del nombre de archivo y cambiar mayúsculas y minúsculas:
fuente
zmv
La herramienta de cambio de nombre zsh es muy buena.Más notas aquí ...
fuente
Para los pingüinos, esto se hace fácilmente en un script de shell o un script AWK. Para nosotros, simples mortales, es posible que desee probar Midnight Commander. Está en la mayoría de las distribuciones de Linux, desde un indicador de comandos de tipo shell mc -a. Puede cambiar el nombre de los archivos con expresiones regulares. Usé el artículo en GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ para ayudarme.
fuente
Aquí hay un ejemplo simple de línea de comandos. Tenía la palabra "blanco" en medio de los nombres de un montón de archivos png. Quería sacarlo y dejar solo un guión bajo. Esto hizo el truco:
fuente
Use vidir y luego use las funciones de su editor para aplicar el patrón de cambio de nombre.
fuente
En un * nix sin perl
rename
disponibleEn algunos * nix no hay cambio de nombre disponible, por lo que es necesario cambiar el nombre utilizando algún otro método. Hace unos años sugerí
zmv
aquí que, aunque excelente, tampoco está necesariamente disponible.Usando builtins y sed, podemos crear rápidamente un script de shell para hacer esto, lo que nos da una sintaxis muy similar al script de cambio de nombre de perl, mientras que carece de algo de manejo de errores, hace el trabajo.
Uso
Digamos que también queríamos crear carpetas de destino ...
Como
mv
no crea carpetas que no podemos usarsedrename
como está aquí, pero es un cambio bastante pequeño, así que creo que sería bueno incluirlo también.Necesitamos una función de utilidad
abspath
(o ruta absoluta) para poder generar la (s) carpeta (s) de destino para un patrón sed / rename que incluye una nueva estructura de carpetas.Esto asegurará que sepamos los nombres de nuestras carpetas de destino. Cuando cambiemos el nombre, necesitaremos usarlo en el nombre del archivo de destino.
Aquí está el guión completo de la carpeta ...
Por supuesto, todavía funciona cuando no tenemos carpetas específicas de destino también.
Si quisiéramos poner todas las canciones en una carpeta,
./Beethoven/
podemos hacer esto:Uso
Ronda de bonificación ...
Usando este script para mover archivos de carpetas a una sola carpeta:
Suponiendo que deseamos reunir todos los archivos coincidentes y colocarlos en la carpeta actual, podemos hacerlo:
Nota sobre patrones sed regex
Las reglas del patrón sed regular se aplican en este script, estos patrones no son PCRE (expresiones regulares compatibles con Perl). Podría haber extendido la sintaxis de expresión regular, utilizando cualquiera
sed -r
osed -E
dependiendo de su plataforma.Consulte el POSIX compatible
man re_format
para obtener una descripción completa de los patrones de expresiones regulares básicas y extendidas de sed.fuente