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; donePero 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 txtPero 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.»
fiLos 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-scriptEn 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; doneLa 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"
fiPara 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.

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 *.txtY no había más historias.
[...]
Precisamente para eso es mmv, tal y como lo comenta Siddharta aquí.
[...] 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 ./*.txtDa el error
mv: el destino, «*.txt», no es un directorio¿Cómo narices se hace esto? [...]
$ mmv "*.old" "#1.txt"Saludos,
Sidd.
Saludos.
[...] 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".
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.
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.
rename *.old *.txtY no había más historias.
rename 's/.old/.txt/' *.oldSustituye los textos en cualquier parte del nombre de los archivos. Para sólo cambiar las extensiones:
rename 's/\.old$/.txt/' *.oldPero a mi siempre me ha bastado con la primera por obvias razones.
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 carpetahombre, 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
Si nos metemos en aplicaciones gráficas thunar tiene un renombrador masivo muy bueno.