LinuxScripts

Organización de ficheros

Los logs son siempre necesarios, pero llega un momento que necesitas tomar la decisión de eliminarlos o almacenarlos en otro dispositivo.
Pero cuando por necesidades del sistema todo está en una carpeta donde pueden coexistir hasta medio millón de ficheros, hacerlo a mano, aunque sea mediante comandos con comodines, se transforma en una tarea criminal.
Es por ello, que sentarse una hora a pensar y realizar un buen script BASH, merece la pena:

!/bin/bash
###############
# Organizador
###############
HOY=$( date "+%Y%m%d" )
LOGFILENAME=logs/organizador_log_$HOY.log
if [ -f "$LOGFILENAME" ] ; then
   printf  "$( date "+%T" ) - El proceso ya fue iniciado.\n" >> $LOGFILENAME
   exit
else
   printf  "$( date "+%T" ) - Iniciado el proceso de Organizado\n" >> $LOGFILENAME
fi

En este primer paso genera un logs del propio organizador, y detecta si ya existía un log para ese día, y en caso afirmativo, salimos del proceso.

CICLO=31
PATH_ORIGEN="ftp/"
ANIO=$(date --date="$CICLO day ago" "+%Y")
MES=$(date --date="$CICLO day ago" "+%m")

PATH_DESTINO=backup
if [ ! -d "$PATH_DESTINO" ]; then
   $(mkdir $PATH_DESTINO)
   $(chmod 775 $PATH_DESTINO)
fi
PATH_DESTINO="$PATH_DESTINO/$ANIO"
if [ ! -d "$PATH_DESTINO" ]; then
   $(mkdir $PATH_DESTINO)
   $(chmod 775 $PATH_DESTINO)
fi
PATH_DESTINO="$PATH_DESTINO/$MES"
if [ ! -d "$PATH_DESTINO" ]; then
   $(mkdir $PATH_DESTINO)
   $(chmod 775 $PATH_DESTINO)
fi

printf "$( date "+%T" ) - Preparadas las carpetas de destino\n" >> $LOGFILENAME

Con este paso vamos a indicar el la cantidad de días máximo de antigüedad (ciclo). En este caso queremos saber todos los ficheros con una antigüedad superior a 31 días.
A continuación calculamos el año y mes que corresponden para ese ciclo y comprobamos que existan las carpetas, y si no, las creamos.

if [ ! -d "$PATH_DESTINO/comprimidos" ]; then
         $(mkdir $PATH_DESTINO/comprimidos)
         $(chmod 775 $PATH_DESTINO/comprimidos)
 fi
 if [ ! -d "$PATH_DESTINO/logs" ]; then
         $(mkdir $PATH_DESTINO/logs)
         $(chmod 775 $PATH_DESTINO/logs)
 fi
 if [ ! -d "$PATH_DESTINO/auxiliares" ]; then
         $(mkdir $PATH_DESTINO/auxiliares)
         $(chmod 775 $PATH_DESTINO/auxiliares)
 fi
 printf "$( date "+%T" ) - Comprobadas las carpetas de organización\n" >> $LOGFILENAME

Además de las carpetas de año y día, necesitamos organizar más los ficheros, por lo que tenemos que comprobar que existen tres carpetas más.

TOTAL_PRE=$(ls -f1 $PATH_ORIGEN/ | wc -l)

Para conocer el estado previo al proceso, guardamos la cantidad de ficheros de la carpeta de origen.

for N in $(find $PATH_ORIGEN -mtime +$CICLO)
do
   FILENAME=$(basename "$N")
   printf "$( date "+%T" ) - $FILENAME\n" >> $LOGFILENAME
   EXTENSION="${FILENAME##*.}"
   
   case $EXTENSION in
      txt)
         $( mv $N $PATH_DESTINO/comprimidos )
         printf "$( date "+%T" ) - Movemos a $PATH_DESTINO/comprimidos\n" >> $LOGFILENAME
         $( gzip $PATH_DESTINO/comprimidos/$FILENAME )
         printf "$( date "+%T" ) - Comprimimos fichero\n" >> $LOGFILENAME
         ;;
      log)
         $( mv $N $PATH_DESTINO/logs )
         printf "$( date "+%T" ) - Movemos a $PATH_DESTINO/logs\n" >> $LOGFILENAME 
         $( gzip $PATH_DESTINO/logs/$FILENAME )
         printf "$( date "+%T" ) - Comprimimos fichero\n" >> $LOGFILENAME            
         ;;
      *)
         $( mv $N $PATH_DESTINO/auxiliares )
         printf "$( date "+%T" ) - Movemos a $PATH_DESTINO/auxiliares\n" >> $LOGFILENAME             
 done

Este bucle es el autentico corazón del script, el que decide según la extensión del fichero a donde se mueve, y si se realizan alguna tarea extra.

TOTAL_POST=$(ls -f1 $PATH_ORIGEN/ | wc -l)

printf "$( date "+%T" ) - Total ficheros previo: $TOTAL_PRE\n"  >> $LOGFILENAME
printf "         - Total ficheros actual: $TOTAL_POST\n"  >> $LOGFILENAME
printf "$( date "+%T" ) - Fin\n\n\n"  >> $LOGFILENAME

Para finalizar volvemos a contar la cantidad de ficheros de la carpeta y lo reflejamos en el log.