Omitir navegación.
Inicio

Limpiar recurso compartido publico y comun

Imagen de SebaMinguez

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"

http://www.odiolasllaves.com.ar/trackback/149