Renombrando varios archivos a la PabliNet

Enviado por PabliNet el 6 Junio, 2011 - 21:11.

En mi entrada anterior (Uniendo videos con Cacarulo) surgió la pregunta de cómo lograr cambiarle la extensión a varios archivos introduciendo un sólo comando. Para eso necesitamos teclear el siguiente script (la idea me la dio Viorel):

for i in *.old; do mv $i `basename $i .old`.txt; done

Pero siguiendo su idea y hablando con un amigo que conoce mucho Bash, mi tiró otra: Hacer un script con argumentos de tal forma de hacer esto:

script old txt

Pero como buen amigo me dijo: "Yo lo sé, es muy fácil pero investigalo vos". ¡Me dio la caña de pescar, no el pescado!

Entonces lo que hice fue ir a Google, busqué y no sé cómo llegué a esta página.

La leí bien, y después de muchos fallidos, logré mi objetivo.

Explicación de mi script:
Lo que primero hace es fijarse cuántos parámetros tiene, eso está en la variable #. Lo que necesito es que el script renombre las extensiones sólo si tiene 2 parámetros. En caso contrario, tire el mensaje de error.
Para eso hacemos:

if [ $# -eq 2]; then
«Orden para cambiar la extensión»
else
«Mensaje de error.»
fi

Los parámetros son variables que cuyo nombres son números que indican su posición. El 0 es la orden al cual se accede al script. Aquí les muestro lo que les quiero decir:

orden argumento1 argumento2 argumento3 argumento4
···0·········1··········2··········3··········4····

Generalmente a un script se accede así:

./nombre-del-archivo-script

En este caso la variable 0 sería: ./nombre-del-archivo-script
También se podría acceder desde un alias o un enlace simbólico y eso cambiaría el valor de la variable 0.
Entonces así renombraríamos los archivos:

for i in *.$1; do mv $i `basename $i .$1`.$2; done

La variable 1 sería la vieja extensión y la 2 la nueva.
El script final quedaría así:

#!/bin/bash
if [ $# -eq 2 ] ; then
for i in *.$1; do mv $i `basename $i .$1`.$2; done
else
echo "Está mal escrito el comando."
echo "El comando correcto es:"
echo "      rf extensión_vieja extensión_nueva"
fi

Para que funcione sólo nos queda darle permisos de ejecución y copiarlos a /usr/bin
Además a este script se le puede agregar otros comandos, y hacer que según con el nombre que lo invocaremos, haga una tarea específica. No es difícil...

Si algo gracioso que me pasó, es que estuve tres horas luchando con el script, cuando me salió, entré a mi entrada anterior y leí el mensaje de Siddharta sobre mmv. Conclusión, si sabía lo de mmv, no habría laburado tanto mi marote.

Imagen de krafa
Enviado por krafa el 10 Junio, 2011 - 23:09.

Me temo que mis conocimientos sobre Bash no dan para tanto.

Agradezco tu post ya que fuí yo él que sacó el tema pero lo que realmente me llama la atención es que no haya un comando sencillo para hacer esto tan básico, sé que las comparaciones son odiosas pero en tiempos de MS-Dos era bastante más fácil, bastaba con:

rename *.old *.txt

Y no había más historias.

Imagen de allan_CR
Enviado por allan_CR el 12 Junio, 2011 - 17:53.
krafa escribió:

[...]

Precisamente para eso es mmv, tal y como lo comenta Siddharta aquí.

siddharta escribió:
krafa escribió:

[...] Hubiese pasado todos los archivos ".old" a ".txt" manteniendo el nombre de cada uno de ellos.

Nunca supe hacer lo mismo en linux ya que...

mv ./*.old ./*.txt

Da el error

mv: el destino, «*.txt», no es un directorio

¿Cómo narices se hace esto? [...]

$ mmv "*.old" "#1.txt"

Saludos,
Sidd.

Saludos.

Imagen de siddharta
Enviado por siddharta el 13 Junio, 2011 - 14:50.
PabliNet escribió:

[...] Si algo gracioso que me pasó, es que estuve tres horas luchando con el script, cuando me salió, entré a mi entrada anterior y leí el mensaje de Siddharta sobre mmv. Conclusión, si sabía lo de mmv, no habría laburado tanto mi marote.

Yo me vi en la necesidad de renombrar varios archivos .JPEG a .JPG ... y fue así como encontré "mmv".

mrgreen

AGREGO: y el consejo de tu amigo fue bueno, pues mira en vez de pescar un pescado has pescado casi una ballena, con lo que aprendiste.

Imagen de siddharta
Enviado por siddharta el 13 Junio, 2011 - 15:22.

Olvidé comentar que mmv lo uso en la línea de comandos, pues en el entorno gráfico uso "Bulk Rename", el cual es un complemento de Thunar (administrador de archivos) en Xfce (el entorno de escritorio que uso desde oct/nov 2010).

Sidd.

Imagen de Viorel
Enviado por Viorel el 13 Junio, 2011 - 17:09.
krafa escribió:
rename *.old *.txt

Y no había más historias.

rename 's/.old/.txt/' *.old

Sustituye los textos en cualquier parte del nombre de los archivos. Para sólo cambiar las extensiones:

rename 's/\.old$/.txt/' *.old

Pero a mi siempre me ha bastado con la primera por obvias razones.

Imagen de PabliNet
Enviado por PabliNet el 13 Junio, 2011 - 20:21.

Otra cosa, con un script de este esto pero más complejo logré descargar fotos desde una cámara dígital.
El comando es así:

comando carpeta
Imagen de CHuLoYo
Enviado por CHuLoYo el 16 Junio, 2011 - 07:47.

hombre, no es por no ser friki, pero yo abro el dolphin, voy al directorio que quiero, pulso CTRL+A y a continuación F2 y renombración masiva, pero el script está chulo. Quizás muy sencillo, se le podría añadir unos options para hacer diferentes tareas (extensión, nombre de fichero, número...)

saludos

Imagen de AllsSecs
Enviado por AllsSecs el 17 Junio, 2011 - 07:18.

Si nos metemos en aplicaciones gráficas thunar tiene un renombrador masivo muy bueno.