Avevo l'esigenza di archiviare i file di log di produzione del mio impianto fotovoltaico; quello che volevo realizzare era un sistema automatico di ripartizione dei file di log in varie directory ognuna per ciascun mese e per ogni anno; in pratica volevo che una procedura automatica prendesse il file di log , ne leggesse il nome e da quello ricavasse la data e quindi venisse copiato in una struttura a albero che comprendesse anno e come directory figlie il nome del mese (in italiano); poichè desideravo automatizzare il tutto con un cronjob in esecuzione una volta alla settimana, optare per una distribuzione linux era quello che ci voleva.

Un nas è quello che ci vuole

Le unità nas oggigiorno sono molto diffuse e sono passate da un ambito prettamente aziendale a quello domestico in modo naturale visto il moltiplicarsi dei flussi dati verso pc, tablet telefonini presenti praticamente in ogni casa. Io possiedo un nas Synology, ma praticamente quasi tutti possiedono embedded delle versioni custom di linux che rendono possibile lo svolgimento di task come quello che descrivo in questo articolo; ovviamente è possibile fare la stessa cosa da un pc, e per come ho concepito io il tutto non è ovviamente necessario che stia acceso 24 ore su 24 ma che lo sia ovviamente quando il cron job andrà in esecuzione.

Concetti base

Per i lettori che non lo sanno, un cron job è una sequenza di istruzione che viene eseguito ad un orario prestabilito che può essere anche multiplo (esempio ogni 10 minuti) o ricorrente nel tempo (es. ogni settimana, ogni giorno ecc); la sua sinstassi è piuttosto intuitiva

I miei file di log sono d questo tipo 17-08-08.CSV ovvero anno-mese-giorno.CSV; l'idea di fondo è scomporre in nome del file ricavando giorno, mese e anno e creando la struttura di directory di conseguenza.

Ecco lo script

#!/bin/sh
LANG=it_IT.utf8

cd /homes/utente/dir_con_file_di_log/
for x in *.CSV; do
nomefile= basename $x .CSV
anno=`expr substr "$x" 1 2`

mese=`expr substr "$x" 4 2`

giorno=`expr substr "$x" 7 2`
annolungo=$(date -d "$anno-$mese-$giorno" +'%Y')
meselungo=$(date -d "$anno-$mese-$giorno" +'%B')
mesebreve=$(date -d "$anno-$mese-$giorno" +'%m')
mkdir -p "$annolungo"
mkdir -p "$annolungo/$mesebreve-$meselungo"

mv "$x" "$annolungo/$mesebreve-$meselungo/"

done

 

Piccola annotazione: l'istruzione LANG=it_IT.utf8 è necessaria per essere sicuri che i nomi dei mesi in forma letterale siano in italiano.

 

Lo script è piuttosto semplice ma efficace; in sostanza un ciclo tra i file di tipo csv (i nostri file di log) si incarica di estrarre dal nome del file  giorno mese e anno e creare le directory nel formato xx-nomemese con x il numero del mese (esempio 01-gennaio e poi spostrvi il relativo file di log.

Chiamiamo questo file copia_log.sh e rendiamolo eseguibile con il comando

chmod +x copia_log.sh

 A questo punto è sufficiente inserirlo in un cronjob ricordando l'ordine di inserimento

Minuti Ora Giorno Mese GiornoSettimana Comando  
0 1 * * 0 /bin/sh /home/helloait/public_html/clean_index.sh

 

In sostanza questa istruzione manda in esecuzione lo script tutte le domeniche all'una di notte.