Desde hace bastante tiempo que utilizo Picasa Web como el lugar donde almacenar las imágenes que muestro en este sitio. Sin embargo, hay dos asuntos que me tienen algo preocupado. Por un lado, el hecho de que se pueden perder todas las imágenes, y por el otro mejorar la respuesta del sitio. Así que he pensado en dedicar un tiempo a la monitorización de directorios.
Una alternativa es utilizar un servicio de almacenamiento tipo Copy, Dropbox, Box, Drive, etc, para guardar las imágenes. Sin embargo, es necesario, el trabajo que Picasa Web hace de forma automática, como es la generación de miniaturas, es necesario hacerlo de forma manual, o buscar una solución para automatizarlo.
Llegados a este punto, es cuando surge la posibilidad de monitorizar directorios en Linux, de forma que cuando copie una imagen en un determinado directorio, de forma automática, esta se mueva a otro directorio, por ejemplo en Dropbox y a la vez me genere una miniatura. Así es como utilicé la monitorización de directorios.
Monitorizando
El concepto
La idea es utilizar tres directorios, uno donde guardo los scripts para copiar y borrar archivos, y generar miniaturas, otro donde guardo las imágenes original, y un tercero para guardar las miniaturas.
Así cuando copio una imagen en el directorio principal, se copia la imagen al subdirectorio original y se crea una copia en el subdirectorio thumbnail.
Incron
Para la monitorización de directorios utilizo Incron, que es un demonio encargado de la monitorización de archivos y directorios.
El primer paso es añadir instalar el paquete, para ello, desde un terminal, ejecutamos el siguiente comando,
sudo apt install incron
El siguiente paso es permitir que nuestro usuario pueda trabajar con incron, para ello, ejecutaremos editaremos el archivo /etc/incron.allow y añadiremos nuestro usuario al mismo, en mi caso atareao. Otra opción es que sea el administrador, root el que se encargue de este trabajo.
Una vez hecho esto ahora nos queda añadir los directorios a monitorizar, y las acciones a tomar en los casos que indiquemos. Para esto, ejecutaremos el siguiente comando,
incrontab -e
y añadiremos las instrucciones
home/atareao/Dropbox/Public/web/images IN_CREATE,IN_MOVED_TO /home/atareao/Dropbox/Public/web/images/scripts/create_thumbnail $@/$#
/home/atareao/Dropbox/Public/web/images/original IN_DELETE,IN_MOVED_FROM /home/atareao/Dropbox/Public/web/images/scripts/delete_thumbnail $@/$#
La primera de las sentencias indica que vamos a monitorizar el directorio home/atareao/Dropbox/Public/web/images, y que en caso de crear, IN_CREATE, o mover, IN_MOVED_TO un archivo a este directorio ejecutaremos el script create_thumbnail al que le pasaremos como parámetro $@/$#, que es el directorio y nombre del archivo separado por una barra /.
La segunda, monitoriza el directorio /home/atareao/Dropbox/Public/web/images/original para que en el caso de borrar, IN_DELETE o mover IN_MOVED_FROM un archivo inmediatamente se ejecute el script delete_thumbnail
Si en algún momento queremos ver las instrucciones que hemos añadido, simplemente tenemos que ejecutar el siguiente comando, que nos listará las instrucciones,
incrontab -l
Ambos scripts se encuentran en su correspondiente directorio…
El script create_thumbnail es el encargado de mover las imágenes a su directorio original y crear la correspondiente miniatura en el directorio thumbnail,
#!/bin/bash
path=$(dirname "$1")
origen=$(basename "$1")
extension="${origen##*.}"
filename="${origen%.*}"
destino="$path"/original/"$origen"
thumbnail="$path"/thumbnail/"$origen"
origen="$path"/"$origen"
echo "$origen"
echo "$thumbnail"
if [ $extension == "png" ]
then
if [ ! -f "$thumbnail" ]
then
/usr/bin/convert -thumbnail 288 "$origen" "$thumbnail"
fi
if [ ! -f "$destino" ]
then
cp "$origen" "$destino"
fi
if [ -f "$origen" ]
then
rm -f "$origen"
fi
fi
Al borrar un archivo del directorio original también queremos que se borre del directorio de miniaturas thumbnail, para ello el código que se ejecutará será el siguiente,
#!/bin/bash
path=$(dirname "$1")
maindir=$(dirname "$path")
origen=$(basename "$1")
extension="${origen##*.}"
filename="${origen%.*}"
thumbnail="$maindir"/thumbnail/"$origen"
if [ $extension == "png" ]
then
if [ -f "$thumbnail" ]
then
echo "rm" "$thumbnail"
rm "$thumbnail"
fi
fi
Otras máscaras
Además de las máscaras que he indicado en el ejemplo, tienes otras máscaras interesantes que puedes tener en cuenta,
- IN_ACCES
- IN_ATTRIB
- IN_CLOSE_WRITE
- IN_CLOSE_NOWRITE
- IN_CREATE
- IN_DELETE
- IN_DELETE_SELF
- IN_MODIFY
- IN_MOVE_SELF
- IN_MOVED_FROM
- IN_MOVED_TO
- IN_OPEN
Conclusiones
Este es un sencillo ejemplo de lo que podemos hacer con incron, una poderosa herramienta que puede ayudarnos considerablemente a mejorar el orden en nuestro equipo. Por ejemplo, si todas nuestras descargas van a un mismo directorio, podemos redirigirlas cuando se haya completado la descarga para que según la extensión vaya a un determinado directorio, mejorando de esta forma el orden en nuestro equipo. En fin, como ves las posibilidades son innumerables.
También tienes otras opciones para la monitorización de directorios como la que te muestro en el artículo sobre inotify-tools.
Más información,
Imagen de portada de Tobias Tullius en Unsplash