[solucionado] Renombrar archivos con un criterio muy concreto

Imagen de da-beat
0 puntos

Hola!

Quisiera renombrar masivamente unos archivos que tengo en una carpeta y programas como pyRenamer no hacen lo que quiero.

Os explico:

Son ficheros mp3 que tengo en un directorio, su nombre sigue el siguiente esquema:

Artista - Titulo Canción.mp3

La primera letra de cada palabra en mayúsculas.

Quiero poner en mayúsculas todas las letras del artista, y sólo del artista. Dicho de otra manera, quiero poner todo en mayúsculas las palabras que van antes del guión -.

Ya que no he encontrado ningún programa que lo haga, supongo que se puede hacer con algún script.

Ayuda por favor!

Muchas gracias!

Imagen de joseluis
+1
0
-1

Con cut puedes cortar una cadena indicandole el separador.
Con tr puedes transformar a mayusculas.

Por ejemplo si en nombrefichero tienes guardado el nombre del fichero mp3, se podría hacer con:

    artista=$(echo ${nombrefichero} | cut -d"-" -f1 | tr a-z A-Z)
    resto=$(echo ${nombrefichero} | cut -d"-" -f2-)
    mv "${nombrefichero}" "${artista} - ${resto}"

Si lo metes apropiadamente en un bucle que te recorra todos los mp3 que quieres ya lo tendrías.
Además sería conveniente que antes de hacer el mv comprobaras que el nombre de fichero transformado es distinto del original para que el mv no de error.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de da-beat
+1
0
-1

Gracias joseluis por contestar.

Debo confesar que mi nivel no es muy avanzado, y que no domino el tema scripts. Sólo sé que debo iniciarlo con #!/bin/bash y poca cosa más...

He de decir que los centenares de archivos mp3 que quiero renombrar no pertenecen al mismo artista.

Por eso te pido si puedes hacerme el script.

Si no es mucha molestia te estaría enormemente agradecido.

:)

+1
0
-1
Imagen de joseluis
+1
0
-1

Hace algún tiempo escribí un par de textos [1] que podía servir como una sencilla introducción al shellscript.
Te aconsejo que te lo leas (o cualquiera de los otros muchos textos sobre bash que hay por internet y que son infinitamente mejores que esto) porque lo ideal es que aprendas por tí mismo, más que nada porque en un futuro puedes tener otra necesidad similar a esta que con otro sencillo script te la podría resolver pero si no sabes hacerlo te encontrarías con que dependes de otros para que te lo hagan.

Aun así te doy algunas pistas para que te resulte más sencillo.
Si miras en mi anterior respuesta tenías la forma de modificar el nombre de ficheros con nombres de la forma "Una cosa - Otra cosa.mp3" a "UNA COSA - Otra cosa.mp3", eso lo hacías con:

  artista=$(echo ${nombrefichero} | cut -d"-" -f1 | tr a-z A-Z)
  resto=$(echo ${nombrefichero} | cut -d"-" -f2-)
  mv "${nombrefichero}" "${artista} - ${resto}"

y para ello tenias que tener en nombrefichero el nombre que querías cambiar.
Logicamente si tienes cientos de ficheros tienes que encontrar una forma más automática de ir tratandolos uno a uno y que en nombrefichero tengas en cada momento el nombre del fichero que se esté tratando, para eso te indiqué que utilizaras un bucle; leyendo el primer enlace que te he puesto puedes encontrar lo siguiente:

En ocasiones querremos repetir algo, por ejemplo convertir de formato todas las imágenes jpg de un directorio y pasarlas a png:

  for i in *.jpg ; do
    convert "${i}" "`echo $i | sed "s/\.jpg$/\.png/g`"
  done

Fijate que lo que tienes ahí es un proceso que recoge todos los ficheros del directorio donde lo ejecutes y cuyo nombre termine en .jpg y por cada uno de ellos (que en este caso su nombre queda almacenado en la variable i) ejecuta convert para convertirlo de formato de imagen. Imaginate que en lugar de la linea del convert metes ahí las tres líneas que te había puesto yo para renombrar el fichero, y además modificas el filtro de los ficheros que vas a coger, en tu caso no te interesan las imágenes jpg sino los ficheros mp3.
Logicamente para usar esas tres líneas dentro del for (lo que está entre el do y el done) o bien cambiar nombrefichero por i (pues es en i donde tienes el nombre de cada uno de tus ficheros), o bien pones otra línea antes en la que asignas a la variable nombrefichero el contenido de la variable i:

  nombrefichero=$i
  artista=$(echo ${nombrefichero} | cut -d"-" -f1 | tr a-z A-Z)
  resto=$(echo ${nombrefichero} | cut -d"-" -f2-)
  mv "${nombrefichero}" "${artista} - ${resto}"

Ya practicamente lo tienes, lo que tendrías que hacer es afinarlo un poco más. Por ejemplo, imaginate que alguno de los ficheros ya es del tipo "UNA COSA - Otra cosa.mp3", logicamente ese fichero no tienes que renombrarlo, sobre todo porque el script te mostrará un mensaje de error cuando intente "mover" (mv) un fichero a sí mismo (no pasa nada con el error simplemente te avisa que son idénticos). Para evitar esto es tan simple como ejecutar mv únicamente cuando el nombre de destino sea distinto al de origen. Nuevamente en el primer enlace que te puse puedes encontrar lo siguiente:

En el caso de la comparación de textos conviene utilizar las variables encerradas entre ""

  nombre="Pedro"
  if [ "${nombre}" == "Antonio" ]; then
    echo Es Antonio
  else
    echo No es Antonio, es ${nombre}
  fi

Es decir si lo aplicas a tu script lo que tendrás que hacer es preguntar si el contenido de nombrefichero es distinto de "${artista} - ${resto}" y si se cumple ejecutar el mv (el distinto es !=):

  if [ "${nombrefichero}" == "${artista} - ${resto}" ]; then
     mv "${nombrefichero}" "${artista} - ${resto}"
  fi

Y por último, ten en cuenta que en los sistemas UNIX (y GNU/Linux es similar a UNIX) se diferencian las mayusculas de las minusculas, es decir no es lo mismo mp3 que MP3 en el nombre de un fichero, por lo que en previsión que tus ficheros mp3 tengan la "extensión" tanto en mayúsculas como en minúsculas, sería conveniente que cambiaras el filtro del for (*.mp3) para que te coja no solo los mp3 sino los Mp3, mP3 y MP3. Esto es bastante sencillo, en lugar de poner for i in *.mp3 ; do utiliza for i in *.[Mm][Pp]3 ; do y lo tendrás (los corchetes lo que dicen es que tome uno cualquiera de los caracteres que aparecen dentro).

Si juntas todo esto tendrás el script que necesitas, pero reitero mi consejo, lee sobre shell script porque es una herramienta muy poderosa, y bastante sencilla de utilizar.

[1] Aventurandose por los shell scripts y Aventurandose por los shell scripts II

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de da-beat
+1
0
-1

SÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

He hecho los deberes! Y me han salido! jajajaj

Leyendo detenidamente "Aventurandose por los shell scripts" y rememorando cuando estudié programación (hace ya unos añitos...) lo he conseguido. Así lo he hecho:

#!/bin/bash

for i in *.mp3 ; do

artista=$(echo "${i}" | cut -d"-" -f1 | tr a-z A-Z)
resto=$(echo "${i}" | cut -d"-" -f2-)
mv "${i}" "${artista} - ${resto}"

done

Las extensiones de todos los archivos son .mp3, ni .MP3 ni variables.
Y aunque ya había algún fichero con el nombre del artista en mayúsculas no me ha dado ningún error.

Mil y una gracias! ;)

Ahora a ver si consigo editar masivamente los tags del mp3 con los mismos parámetros :P

+1
0
-1
Imagen de joseluis
+1
0
-1

Por si no lo sabes y te sirve de ayuda para los tags del mp3, tienes el comando id3tag, y en el script anterior ya tenías sacado el autor a una variable, por lo que únicamente tendrías que quitarle el ".mp3" al resto para tener también el título de la canción (una opción para esto puede ser utilizar sed); y como diría cierta presentadora de un concurso televisivo muy pero que muy añejo cuyo nombre eran 3 números, hasta aquí puedo leer :-)

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado