martes, 7 de diciembre de 2010

3 Shell Scripts para GNU/Linux

A veces hace falta un microprograma que haga algo, simple pero repetitivo, o no es posible encontrar un programa que cumpla un cometido muy específico. Para estos casos, un shell script en Gnu/Linux puede ser una buena opción. Yo tengo 3 pequeñísimos scripts que uso de tanto en cuanto, y que voy a explicaros por si a alguien le pueden ser útiles.

-Descarga masiva de ficheros consecutivos
Por ejemplo fotos de un sitio web. Un script muy simple que simplemente descarga las imágenes en el directorio desde el que se ejecuta. La principal utilidad es que automáticamente "sube" el contador.

#!/bin/sh
## inicializar una variable contador a 1
i=1
## bucle para los elementos 001 a 009
while [ $i -le 9 ]
do
## usamos wget para la descarga propiamente dicha
/usr/bin/wget http://www.ejemplo.com/directorio/fichero00"$i"
i=`expr $i + 1`
done

## bucle para los elementos 010 a 099
while [ $i -le 99 ]
do
/usr/bin/wget http://www.ejemplo.com/directorio/fichero0"$i"
i=`expr $i + 1`
done

## repetir si es necesario para los elementos 100 a 999

Cuidado con las descargas masivas de ficheros, hay sitios web que os cortarán la conexión si lo haceis.

- Descarga de imágenes de una webcam
Este script y el siguiente los utilicé para obtener las imágenes de la estación de espacio profundo de Cebreros. El primer script se conecta a la webcam cada 30 segundos y descarga una imágen estática (no todas las webcams permiten esto), guardándola con un nombre consecutivo. Para que el nombre sea único, utiliza el tiempo unix añadido al sufijo que le indiquemos. Esto causó un curioso problema que solucioné con el tercer script...

#!/bin/sh
## inicializar una variable contador a 1
i=1
## bucle principal, ajustar según sea necesario
while [ $i -le 3000 ]
do
## wget para la descarga de la imágen
wget http://www.ejemplo.com/imagen-webcam.jpg -O fichero`date +%s`.jpg
## temporizador, ajustar al gusto, 30 segundos
## está bien para un stop-motion de 24 horas
sleep 30
i=`expr $i + 1`
done
echo "FINALIZADO"


- Renombrado masivo de ficheros consecutivos
Una vez descargados las imágenes de la webcam me di cuenta de un curioso problema: la fecha unix tiene este formato: 1291756602. Así que me encontré con 3000 ficheros, perfectamente ordenados, pero con unos nombres raros raros. La solución fue el siguiente script, que mediante los comandos ls y head obtiene el primer fichero del total para que pueda ser renombrado de forma consecutiva. El nombre destino debe estar alfabéticamente detrás de los ficheros a renombrar, o no funcionará.

#!/bin/sh
## inicializar una variable contador a 1
i=1
## el contador debe coincidir con el total de ficheros
while [ $i -le 3000 ]
do
## con mv hacemos el renombrado, y anidamos ls y head
## para obtener el nombre limpio del fichero a renombrar
mv `ls |head -n1` fichero"$i"
i=`expr $i + 1`
done
echo "FINALIZADO"


Espero que pueda ser de utilidad :-)