miércoles, 13 de abril de 2022

Renombrar archivos (con 'rename')

Hace 4 años creé una entrada al blog, titulada ‘Renombrado masivo de archivos’, donde daba algunas ‘recetas’ para cambiar, por lotes, el nombre de archivos, tanto por consola (con un vistazo rápido a ‘rename’, que, por cierto, es un paquete (al parecer una extensión Perl) que requiere instalación) como con una utilidad gráfica, que se llama GPrename y que todavía anda por los repositorios oficiales de Debian.
Ahora me apetece dar una vuelta de tuerca al tema y, como lo del GPrename me da pereza, porque creo recordar que era un poco lioso, husmeando por Google para resolver un caso específico, que es el de cambiar ‘parte del nombre’ de muchos archivos… me topé de nuevo con el famoso ‘rename’… que me apeteció ‘explorar’, porque cada vez me vuelvo más ‘conceptual’

Por centrar ideas, mi problema específico consistía en que, hace mucho, me descargué la serie completa de TV ‘Agatha Christie – Hercules Poirot’… pero resulta que todos los capítulos (y son 13 temporadas...) se llaman «Poirot (Agatha Christie) 01x01 ‘titulo del episodio’». Total que ahora, al intentar visionarlos por la TV, vía soporte USB, por las limitaciones de la pantalla solo veo… ‘Poirot (Agatha Chris… ‘ y me es muy incómodo elegir el capítulo que quiero ver.
Así que… ¿cómo quitar, a los cerca de 80 episodios, el ante-título, para que se llamen solamente… ‘01x01 titulo del episodio.avi’, etc.?

Bien, pues descubrí que es enormemente fácil renombrar total o parcialmente los nombres de los archivos, por lotes, con el mandato ‘rename’ (y, en extremo, si están en varias carpetas, ayudado por el comando ‘find’). Basta definir la cadena de caracteres que quieres quitar, y la cadena de caracteres que quieres poner, en su sustitución.
Así que vamos a verlo...
En plan sencillo, la sintaxis del mandato ‘rename’, para renombrar archivos, abierta la consola en la ruta donde están guardados, y por medio de ‘expresiones regulares’, es esta
rename 's/cadena1/cadena2/g' *
(Nota al margen con una definición de libro: se llama ‘expresión regular’, en Linux, a una secuencia de caracteres y metacaracteres que forma un patrón de búsqueda (se dice en Linux que la expresión ‘se expande’), y se usa principalmente para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones. Hay muchas expresiones regulares, proveen al usuario de una manera muy flexible de buscar o reconocer cadenas de texto, son (es cierto) para expertos… pero nada nos impide aprovecharnos de ellas, si son sencillas... De hecho, las usamos...


Y en el caso que nos ocupa, la expresión regular
rename ‘s/QUITAR/PONER/g’ *.mp3
ordena que se sustituya la primera cadena (lo que indicamos que hay que QUITAR) con lo que dice la segunda cadena (lo que deberá PONER) en todos los archivos *.mp3 que encuentre en su ruta.
Por cierto, además lo ponemos entre comillas simples por si la cadena pudiese contener varias palabras separadas)
Es muy importante el modificador ‘g’, porque indica que se sustituyan por la cadena 2 todas las apariciones de la cadena 1 (Si no lo hacemos así, solo se reemplazaría la primera aparición).
Y hay otro posible modificador, ‘ i ‘ que ordenaría no hacer distinción entre mayúsculas y minúsculas. Se pondría, por ejemplo, así .../gi

Y nos quedaría el objetivo: ¿A quién…? Pues, con el muy conocido ‘metacaracter’ ‘asterisco’ (*) indicamos que lo haga ‘a todos los archivos que encuentre es la ruta donde se ha abierto la consola'. O podemos (como en el ejemplo de antes, con *.mp3) limitarnos a determinada extensión.
En resumen, la orden con rename para sustituir todo (o parte) de unos nombres de archivo sería, abriendo una consola en la ruta donde se encuentran...
rename ‘s/QUITAR/PONER/gi’ *
Y, en mi caso particular, como quiero quitar ‘Poirot (Agatha Christie)’ y poner, en su lugar (como mucho) el símbolo ‘#’, para que los títulos sean… # 01x01 titulo del episodio’, sería escribir, en consola…
rename ‘s/Poirot (Agatha Christie)/#/g’ *


Pero metido en harina, voy a hacer algunas puntualizaciones, para que quede más completo el desarrollo del tema:
A) Renombrado recursivo
En el caso de querer renombrar archivos de varios directorios que ‘cuelgan’ de una carpeta (directorio) padre, hay que apoyarse en el comando ‘find’. El mandato sería el siguiente:
find /ruta_carpeta_padre/ -type f -exec rename 's/QUITAR/PONER /' '{}' \;
Fuente: https://www.vichaunter.org/como-se-hace/renombrar-varios-archivos-desde-consola-linux

B) Problemas con determinados caracteres
Puede ocurrir que surja algún problema, a la hora de renombrar, con determinados caracteres. Por ejemplo, a mi me ha pasado con los paréntesis en los títulos, que al parecer no los admitía en la ‘cadena’.
NO PROBLEM: hay una orden (a ejecutar previamente) que los elimina. Así que si hacemos, previamente, un
rename 's/\(|\[|\]|\)//g' *
eliminaremos todos los paréntesis, corchetes, barras, antibarras… que contengan los archivos que se encuentren en una ruta dada (si en vez de ‘ * ‘ ponemos, por ejemplo, ‘ *.jpg’ lo aplicaríamos, claro está, solamente a ese tipo de archivos)
Por cierto, si también queremos quitar los espacios en blanco de los títulos, bastaría añadirlo (como un espacio en blanco). Por ejemplo, verlo aquí al final de esta lista de signos a eliminar…
rename 's/\(.*\)|\[.*\]| //g' *

C) Otras interesantes opciones
La opción ‘ -n ‘ indica que no haga los cambios, que se limite a presentar (en consola, con ‘ -v ‘ los sacaría por pantalla) cómo quedarían los nombres, tras el ‘rename’. (muy útil, por ejemplo, para el caso anterior, de eliminar caracteres).
Así que
rename -n 's/\(|\[|\]|\)//g' *
te permitiría ver previamente cómo quedarían los cambios y, si estás de acuerdo, quitas la opción -n… y los ejecutas definitivamente.
Y si en vez de usar la expresión regular rename ‘s/….’ usamos la expresión rename ‘y/…’ lo que hacemos es, en vez de sustituir la cadena completa, sustituir, uno por uno, los caracteres que indiquemos. Asi...
rename ‘y/a1c/b2m/g’
sustituiría ‘a’ por ‘b’, ‘1’, por ‘2’ y ‘c’ por ‘m’
Esta expresión se usa mucho para cambiar rangos. Por ejemplo, para quitar las mayúsculas, se haría con
rename y/A-Z/a-z/ *

Así que habrá que acordarse de que existe este buen mandato, ‘rename’, que para cosas sencillas es muy fácil de usar… y de estos ‘tips’ que apunto.

No hay comentarios:

Publicar un comentario