martes, septiembre 20, 2011

Cambiar nombres de archivos en un terminal

Aunque hay grandes aplicaciones para renombar archivos en Linux, como Pyrenamer, a veces te encuentras con mucho archivos en la linea de comando que quieres renombrar y tu tonto orgullo te obliga a pensar que debe ser muy fácil.

Primero piensas en algo tan sencillo como:

& mv *.mp2 *.mp3

Pero Bash no te lo pone fácil, como la orden mv sirve tanto para mover como renombrar, te comenta que no existe el directorio *.mp3; si miras el man de mv no acabas de verlo claro, así que nos vamos a Google, donde vemos que la mayoria de los mensajes o te llevan a un pequeño script (muy interesante pero no es lo que buscas) o te dicen que te dejes de tonterías y que instales el Pyrenamer, que para eso esta ;-)

Como soy muy cabezón, sigo buscando y por fin encuentro algo, en Deries habla del comando rename; no parece sencillo pero algo es algo:

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

Si vemos la sintaxis, lo que mas llama la atención es "perlexpr", como no sabemos nada de perl, Deries nos explica que en perl la expresión para sustituir en una cadena o string tiene esta forma 's/antiguo/nuevo/', donde se sustituye la palabra antiguo por la palabra nuevo en todos los nombres de los archivos [files] que pongamos al final de la orden.

Vamos a ver varios ejemplos:

-Cambiar la extensión de varios archivos.

rename -v 's/\.mp2$/\.mp3/' *.mp2


Lo hemos conseguido, pero vamos a verlo poco a poco, para que podamos sacarle mas partido a rename en otros casos:

-v es verbose, que nos explique lo que ha hecho, que nos informe

's/\.mp2&/\.mp3/' si nos acordamos sustituimos \.mp2& por \.mp3; ¿Y por que no ponemos solo .mp2 por .mp3? El tema es que el punto . en perl es un comodín que signfica cualquier caracter en una cadena; para que no lo tome como comodín y lo tenga en cuenta como el caracter . (punto) hay que ponerle delante el signo \ ( se escapa) y asi no hay duda de que el programa buscara la secuencia .mp2; también el signo $ indica el final del nombre o cadena ( ya que estamos cambiando la extension del archivo, que siempre esta al final).

*.mp2 Aqui indicamos que tome todos los archivos con extensión mp2 del directorio.

-Cambiar parte del nombre del archivo:

rename -v 's/IMG_/foto_/' *.jpg

Al igual que antes, vamos a sustituir la palabra IMG_ por foto_ en todos los archivos con extensión jpg del directorio. Importante poner la expresión de perl entre comillas simples para no tener problemas.

-Incluir un texto en el nombre del archivo.

rename -v 's/\.jpg$/_mini\.jpg/' *.jpg

Es igual al anterior, pues quitamos algo (.jpg) para añadirlo después mas lo que queremos añadir (_mini\.jpg).

-Quitar una parte del nombre del archivo.

rename 's/Re1//' *.mp3

En este caso tenemos muchos mp3 con el nombre correcto de la canciones, pero al final, antes de la extensión, han añadido las letras Re1 , que queremos quitar o lo que es lo mismo sustituir por nada,que es lo que hay entre las dos barras (//).

Una vez entendido, vemos que rename puede ser una gran ayuda para manejar muchos archivos, pues lo que siempre se puede asegurar es que estas ordenes son muuuy rapidas.

Espero que sea útil.
[JJ]