Shell Script para renombrar archivos

Hoy me he encontrado con la necesidad de renombrar unos 500 archivos para tenerlos ordenados. En concreto eran imágenes en .jpg.

Para ello,y ya que hacia tiempo que no tocaba el bash, me he entretenido 10 minutos haciendo un Script.

Es sencillo, el script se pone en el mismo directorio que los archivos, se le indica la extensión, se le indica un nombre y un valor y te los renombra recursivamente.

En mi caso por ejemplo, he puesto “Foto”, valor “1” , y se han renombrado a “Foto1.jpg” , “Foto2.jpg” y así sucesivamente.

No es nada del otro mundo, y es bastante sencillo pero ya que últimamente publico pocas cosas en el  blog aquí os lo dejo. Sed curiosos!  😉


#!/bin/bash
clear
echo "Script para renombramiento masivo de archivos"
echo "Continue o pulse Cntrl+C para omitir"
sleep 5
echo
echo
echo "Introduce la extensión de los archivos"
read extt
echo "Introduce un nombre para el renombrado 'ej Foto'"
read nombre
echo "Introduce un valor para empezar con el renombrado ej '10'"
read valor

for fichero in `ls *.$extt`
do
mv $fichero $nombre$valor.jpg
let valor++
done

echo "FICHEROS RENOMBRADOS:"

for fichero in `ls *.$extt`
do
echo $fichero
done

Un saludo!

Juanan.

15 respuestas a “Shell Script para renombrar archivos

  1. Hola Juanan foreando un poco he visto tu scrip y yo tengo que hacer lo mismo pero con una pequeñaa variacion, yo tengo tambien unos centenares de archivos pero mi caso es un poco distinto, te indico a ver si me puedes ayudar.

    Los archivo son jpg normales pero no puedo alterar su nombre original
    Ej.: 500419_099902_foto_9_229393106.jpg

    A este archivo se le tiene que agregar al nombre un prefijo al inicio de forma que este quedara
    Ej.: btr_500419_099902_foto_9_229393106.jpg

    Pero no acaba ahi la cosa si no que despues de renombrarlos necesido duplicarlos en la misma carpeta con otro nombre
    Ej.: mnt_500419_099902_foto_9_229393106.jpg

    Alguna ayuda de como poder adaptar tu scrip para que realizara estos pasos.

    Gracias por la info

    • Esto es bastante fácil,solo tienes que hacer otro bucle for una vez renombrados y ya está..
      Dame un rato y este fin de semana te posteo el codigo a ver si te funciona..Un Saludo y gracias por pasarte por el blog!

  2. gracias me ha sido de gran ayuda

    extt=jpg
    nombre=nombre_archivo
    valor=1

    for fichero in `ls *.$extt`
    do
    mv $fichero $nombre$valor.jpg
    let valor++
    done
    echo “Los archivos se han renombrado”

  3. Buenas Juan, verás quisiera cambiar el nombre de las fotos de una carpeta, añadiendo la letra d al final de todas. Quiero unir varias fotos en un video con ffmpeg y el script de arriba es perfecto para numerarlas, pero intente cambiarlo un poco pero no consigo que la d aparezca en todas, solo en la ultima. Podrías hacer uno para hacer esto? Siento pedirlo asi pero no sé nada de programacion. Gracias de antemano

  4. Juan, ignora mi post. No tengo que añadir la d a los archivos. Ahora necesito establecer el tiempo entre las fotos para el video, pero ese ya es otro tema. Felicidades por tu script, muy bueno.

  5. No funciona en ubuntu 14 solo mueve todos los archivos a 1 solo y borra los demás.

    Al final este me dio resultado:

    #!/bin/sh

    echo “Seleccione extensión: ”
    read EXT
    echo “Seleccione nombre: ”
    read NOM

    ls *.$EXT | cat -n | while read n f; do mv “$f” “$n-$NOM.$EXT”; done

  6. Está genial el script. Sabes si se puede hacer partiendo de una lista previa? Tengo un archivo de calc (libreoffice). En una columna está el nombre original de la imagen, y en la columna contigua el nombre final que debe tener. Esta en csv, por tanto es como si fuera un txt. Sabes si se puede hacer un bucle que busque el primer archivo y lo renombre por el campo de al lado, asi asi? Gracias

    • Claro, necesitarías primero parsear el archivo CSV y luego ponerlo en un array asociativo,
      para poderlo renombrar, de todas formas este post es muy viejo, todavía estaba empezando de sysadmin, hay mejores formas de hacerlo y más efectivas. Te aconsejo que practiques con la terminal, entiendas lo que hacen los bucles, comandos, etc, y luego te montes tus propias herramientas, disfrutarás con ello.

      Te dejo un par de enlaces que pueden resolver tus dudas, saludos.
      https://stackoverflow.com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash

      http://www.elmundoenbits.com/2012/09/arrays-asociativos-en-bash.html#.WkY8J-niZhE

      • Gracias, al final lo resolví asi:
        #! /bin/bash

        for LINEA in `cat datos.txt ` #LINEA guarda el resultado del fichero datos.txt
        do
        original=`echo $LINEA | cut -d “#” -f1` #Extrae original
        reemplazar=`echo $LINEA | cut -d “#” -f2` #Extrae final

        mv $original $reemplazar

        done

        El problema q me dio al ppio eran los espacion en blanco en los archivos, que como me daba igual y tenia prisa, los susitui por guiones con el calc (libreoffice) y arreando. Luego me di cuenta que podia haber usado \n, pero ya era tarde, lo tenia resuelto y colgado. Datos es un archivo de texto separado por almohadillas, donde viene nombreinicial#nombrefinal, hecho con calc. Ya se que no es una solucion ni limpia ni modular, pero como al final lo que cuenta son las prisas y el resultado, y el resultado valia, pues asi lo resolvi.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s