Limpiar recurso compartido publico y comun

Es normal en las empresas destinar un recurso compartido publico de forma que los usuarios puedan intercambiar información entre ellos.
Mas cierto aún es que, si lo permitimos, el contenido crece desmesuradamente debido a que los usuarios se olvidan de eliminar los archivos que colocan.
Para mitigar un poco este fenomeno se me ocurrió realizar un script en bash que busque los archivos que no han sido modificados durante X numero de dias y los borre. Para no ser tan brusco defini un "periodo de aviso" en el cual se le avisa por mail al usuario los archivos que pronto serán eliminados.
Las primeras versiones del script las realice en un equipo con Bash > 4.0, pero luego tube que adaptarlo a bash < 4.0 por lo que encontraran comentarios al respecto y algunas desprolijidades.
!/bin/bash #Parametros por defecto y comportamiento según al cantidad de parámetros. nDiasBorrado=6 nDiasAviso=12 pathLimpiar=/algo/inexistente TMP="/tmp" LANG="es_AR.UTF-8" LANGUAGE="es_AR:en" LC_ALL="es_AR.UTF-8" MAILRC=/dev/null sendcharsets=utf-8 ## Comienzo definición funciones Script function ayuda() { echo " Utilizar: $0 <Directorio> [<nDiasAviso> [<nDiasBorrado>]] Indicar el directorio donde se buscarán los archivos. Para aquellos mas antiguos que nDiasAviso se le dará aviso al usuario dueño. Debe ser mayor o igual a 0 y por defecto el valor es $nDiasAviso. Luego nDiasBorrado la cantidad de dias (desde el aviso) que se espera antes de eliminar el archivo. Debe ser mayor o igual a 0 y por defecto el valor es $nDiasBorrado. " exit 128 } function getMail () { #devuelve el mail del usuario pasado como parametro local mail=$1'@bioceresgroup.local' echo $mail } function getFiles () { #Obtiene archivos, directorios y subdirectorios #En bash > 4.0 #shopt -s globstar #pathLimpiar=$1/** #En bash < 4.0 echo "$(find $1 -print)" } function clasificarFiles () { local archivo local archivos=$1 cd "$1" || ayuda for archivo in * do if [ ! -e "$archivo" ]; then continue #si no es archivo no analizar fi if [ -d "$archivo" ]; then clasificarFiles "$archivo" else uOwner=$(stat -c %U -- "$archivo" || exit ) #Usar comillas en $archivo por los espacios en los nombres fModificado=$(stat -c %Y -- "$archivo") #en EPOCH time diasRestantes=$(( ($nDiasBorrado + $nDiasAviso) - ( ($now - $fModificado) / (60*60*24) ) )) nArchivos=$(($nArchivos + 1)) if [ $diasRestantes -le ] then #Archivos a Eliminar #listaArchivosEliminar[$uOwner]=${listaArchivosEliminar[$uOwner]}"$archivo \n" #Sumar el archivo a la lista bash > 4.0 echo "$(pwd)/$archivo" >> $TMP/ListaArchvivosEliminar/$uOwner #Sumar el archivo a la lista rm "$(pwd)/$archivo" && echo -e "$(pwd)/$archivo \t\t\t Eliminado" nArchivosEliminados=$(($nArchivosEliminados + 1)) elif [ $diasRestantes -le $nDiasBorrado ] then #Periodo de aviso #listaArchivos[$uOwner]=${listaArchivos[$uOwner]}"$archivo \t\t\t con $diasRestantes dias antes de ser eliminado \n" #Sumar el archivo a la lista echo -e "$(pwd)/$archivo \t\t\t con $diasRestantes dias antes de ser eliminado" >> $TMP/ListaArchvivos/$uOwner #Sumar el archivo a la lista echo -e "$(pwd)/$archivo \t\t\t con $diasRestantes dias antes de ser eliminado " nArchivosAviso=$(($nArchivosAviso + 1)) fi fi done cd .. } #Verificar tercer parametro if [[ $# -eq "3" ]]; then if [[ $3 -ge ]]; then nDiasBorrado=$3 else echo "ERROR: El numero de dias debe ser mayor o igual a 0" ayuda fi fi #Si son dos parametro son Directorio y nDiasAviso if [[ $# -ge "2" ]]; then if [[ $2 -ge ]]; then nDiasAviso=$2 else echo "ERROR: El numero de dias debe ser mayor o igual a 0" ayuda fi fi #Si es un parametro es el directorio, comprobar que exista if [[ $# -ge "1" && -e $1 ]]; then pathLimpiar=$1 else echo "ERROR: Indique un directorio o archivo existente" ayuda fi #echo $nDiasBorrado #echo $nDiasAviso #echo $pathLimpiar ## Ya con los parámetros empezamos a procesar. echo " [$(date)] Inicio verificación directorio $pathLimpiar. Se informa de archivos con mas de $nDiasAviso dias. Luego de $nDiasBorrado se eliminan. " now=$(date +%s) nArchivos= nArchivosEliminados= nArchivosAviso= #declare -A listaArchivosEliminar #declaramos como array asociativos # en bash < 4.0 no se pueden usar arrays asociativos de forma practica. Se implemetna con archivos en /tmp # un directorio por lista, un archivo por usuario mkdir $TMP/ListaArchvivosEliminar 2> /dev/null rm -f $TMP/ListaArchvivosEliminar/* 2> /dev/null #declare -A listaArchivos #declaramos como array asociativos mkdir $TMP/ListaArchvivos 2> /dev/null rm -f $TMP/ListaArchvivos/* 2> /dev/null clasificarFiles $pathLimpiar #Una vez generadas las listas de archivos las procesamos for Usuario in $(find $TMP/ListaArchvivosEliminar/* -printf %f\\n 2>/dev/null) do echo $(getMail $Usuario) echo -e "Se han eliminado del directorio GENERAL los siguientes archivos pertenecientes a $Usuario, por considerarse fuera de uso: $(cat $TMP/ListaArchvivosEliminar/$Usuario) " | mail -s "Archivos eliminados del directorio GENERAL" $(getMail $Usuario) done for Usuario in $(find $TMP/ListaArchvivos/* -printf %f\\n 2> /dev/null) do echo $(getMail $Usuario) echo -e "Los siguientes archivos, pertenecientes a $Usuario, estan pronto a ser eliminados: $(cat $TMP/ListaArchvivos/$Usuario) " | mail -s "Archivos proximos a ser eliminados del directorio GENERAL" $(getMail $Usuario) done # Calculates and outputs total time taken after="$(date +%s)" elapsed="$(expr $after - $now)" hours=$(($elapsed / 3600)) elapsed=$(($elapsed - $hours * 3600)) minutes=$(($elapsed / 60)) seconds=$(($elapsed - $minutes * 60)) echo "Tiempo TOTAL: $hours:$minutes:$seconds Procesados $nArchivos, $nArchivosEliminados eliminados y $nArchivosAviso pronto a ser eliminados."
Trackback URL for "Limpiar recurso compartido publico y comun"
- SebaMinguez's blog
- Inicie sesión o regístrese para enviar comentarios
