Hay detalles en los que uno no repara en la fase de diseño pero que luego echa en falta cuando tiene la aplicación, o lo que sea, en marcha. Como comentaba al final de la última entrada relativa al proyecto de las pantallitas, aquí echábamos de menos un control sobre la fecha de caducidad de los ficheros. Afortunadamente tenemos múltiples formas de solucionar esto, desde las elegantes: con un formulario, haciendo uso de Apache, PHP, MariaDB, etc; hasta la fácil y churrutera que he elegido: modificando el nombre de archivo.
Modificando el nombre de archivo podemos seguir trabajando como hasta ahora, subimos un archivo con un determinado nombre y el sistema hace el resto. Ahora bien, se trataba de no perder el resto de funcionalidades: archivos que van a una sola pantalla, sonido, etc.
También esto se puede hacer de varias formas, pero por la que me he decantado es añadiendo un punto y la fecha antes de la extensión, quedando más o menos así:
[opción]nombre_archivo[opción].ext >> [opción]nombre_archivo[opción].fecha.ext
Y siempre justo antes de la extensión pongamos o no opciones de especificar pantalla o audio.
La fecha que habremos de poner será la del evento o del último día del mismo, en formato YYYYMMDD (año con cuatro dígitos, mes con dos dígitos y día del mes con dos dígitos), y al día siguiente el fichero será borrado.
Si no se pone fecha no pasa nada, simplemente ese fichero no caducará.
El script es muy sencillo, de hecho no lleva ningún sistema de control ni nada, por lo que si ponemos una fecha mal el fichero no se borrará, pero vamos, esto ya cada cual que lo complique cuanto quiera pero creo que no hace falta más, vamos a tener informes con los nombres de ficheros, los vamos a estar viendo al conectarnos a la carpeta… en fin, que un mínimo de atención por nuestra parte tampoco viene mal.
Este es el código:
Fácil ¿no?
Vamos por partes: Este script lo alojaremos en el servidor y le daremos permisos de ejecución. Programaremos una tarea con crontab para que se ejecute de madrugada, a partir de las 00 La hora en realidad da un poco lo mismo, porque desde que apagamos la pantalla por la noche hasta que se enciende por la mañana, en cualquier momento una vez hayamos cambiado de fecha puede ejecutarse.
En la línea 2 calculamos la fecha que era «ayer» y si coincide con la que tiene el fichero lo borramos. ¿Por qué ayer? Pues porque si el evento se celebró «ayer» o «ayer» era el último día, es obvio que «hoy» no hace falta anunciar nada. La comparación se hace en la línea 8, de forma que si las variables «de texto» coinciden el fichero se borra. Compararlas como si fueran de texto tiene la ventaja de que nos evitamos errores si el fichero no lleva fecha e intentamos comparar un número con una cadena alfanumérica. Por contra, para nuestros fines, nos obliga a usar sólo el «igual que», ya que de otro modo se podrían borrar ficheros sin caducidad, por eso hay que tomar la fecha de «ayer».
Para sacar la fecha de caducidad del nombre del fichero recurrimos a algo que ya tenemos hecho en el script proyecta.sh Primero almacenamos el nombre con la extensión, eliminando la ruta ($filename en línea 5), luego eliminamos del mismo la extensión ($nombrefichero en línea 6) y luego extraemos la fecha del mismo modo que extraemos la extensión en proyecta.sh (variable $caduca en línea 7)
Ahora ya sólo resta programar el script para que se ejecute con crontab a una hora indecente y listo.
Modificar proyecta.sh
Pero el intercalar esto en el nombre de archivo nos obliga necesariamente a modificar ligeramente, muy ligeramente, el fichero proyecta.sh Recordamos que allí recogemos en la variable $fname el nombre del fichero sin la extensión, vamos a hacer memoria:
Estas son las líneas que tenemos ahora, que están pensadas para un fichero del tipo nombre_fichero.ext de forma que $extension sería «ext» y $fname sería «nombre_fichero».
Sin embargo si ahora tenemos nombre_fichero.fecha.ext la variable $fname será «nombre_fichero.fecha», con lo que la opción de audio no nos funcionaría, así que necesitamos quitar la fecha de esa variable y el procedimiento no es nada complicado, de hecho es una minúscula y sutil modificación, esta:
Exacto, cambiar «%» por «%%» en la línea que asigna el valor a la variable $fname (en este caso de ejemplo, la línea 49). Esto hace que se elimine, desde la derecha, todo lo que haya hasta el último punto. Si hay uno se eliminará sólo la extensión, si hay dos, porque el fichero lleva fecha de caducidad, se eliminará la extensión y la fecha. Y ojo, ya imagino que os habréis dado cuenta, pero acabamos de añadir una restricción en los nombres de ficheros que es importante: el nombre del fichero no puede contener más puntos.
Y ya está, eso es todo, ya podemos subir ficheros sin preocuparnos de tener que borrarlos.
Dejo el script «caducados.sh» en formato texto para copiar y pegar. La modificación del «proyecta.sh» es tan simple que no veo que haga falta copiar todo el texto ni subir un fichero nuevo, que hay que ahorrar ancho de banda que está la cosa mu achuchá.
#!/bin/bash ayer=$(date --date "yesterday" +%Y%m%d) for file in /home/pi/datos/pantallas/* do filename=$(basename $file) nombrefichero="${filename%.*}" caduca="${nombrefichero##*.}" if [ $caduca = $ayer ] then rm $file fi done
Ah! Y sí, me encantan los mejillones, son nutritivos, muy beneficiosos para la salud y están de rechupete en cualquiera de sus formas y presentaciones 🙂
Ficheros tratados en esta entrada
-
- caducados.sh: Borra los ficheros cuando caduquen.
- proyecta.sh: Hay que modificar el script principal como se indica
- crontab: Hay que programar caducados.sh para que se ejecute con crontab