Hola
A ver que te parece el script siguiente.
No está muy depurado pero te puede servir de guía y es funcional. Si alguno quiere optimizarlo y mejorarlo... que lo escriba por aquí que lo mío no es bash
Como primeros parámetros le damos la ruta absoluta de la carpeta a comprobar y las direcciones de correo del remitente y destinatario para dar los avisos pertinentes.
Comentabas que eran películas, así que entiendo que NO hay subdirectorios y no hay una gran actividad diaria de cambios.
El funcionamiento es básicamente el siguiente:
- la primera vez se crea en el directorio el archivo md5.txt. En su interior la lista de archivos actuales con su md5
- comprobamos si nos falta un archivo de los que teníamos anteriormente. Envía un correo.
- comprobamos de los que tenemos si coincide la firma md5 calculada anteriormente con la que hay escrita en el md5. Envía un correo.
- comprobamos si hay nuevos archivos en el directorio y lo agregamos al md5. Envía un correo.
Al archivo yo lo he llamado md5.sh. Generalmente suelo crear una carpeta llamada "Scripts" en /share/MD0_DATA o en el tipo de volumen que tengamos establecido. Pero es importante que estén dentro de /share para que se mantenga tras los reinicios de la Qnap.
Este archivo debemos añadirlo al programador de tareas (Cron )
Si por ejemplo queremos que el archivo /share/MD0_DATA/Scripts/md5.sh se ejecute a las 01:00 los pasos son:
echo -e "00 1 * * * /share/MD0_DATA/Scripts/md5.sh">> /mnt/HDA_ROOT/.config/crontab
crontab /etc/config/crontab
#! /bin/bash
ruta="/share/MD0_DATA/Public"
destino="correo1@hotmail.com"
remite="correo2@hotmail.com"
# compruebo si ya existe el archivo MD5.txt anterior
if [ -f $ruta/md5.txt ]; then
#existe md5.txt
# leo las líneas y busco archivo en md5.txt para luego comparar
while IFS= read -r linea || [[ -n "$linea" ]]; do
md5="${linea:0:32}";
archivo="${linea:33:200}";
# echo "${archivo} ${md5}" ;
if [ ! -f $archivo ]; then
#echo "FALTA el archivo $archivo"
# envío un archivo avisando de que falta el $archivo en el directorio
# si falta n archivo, enviará n correos. Esto es mejorable
echo "Subject: Falta un archivo" > correo.txt
echo "From: $origen" >> correo.txt
echo "To: $destino" >> correo.txt
echo "Falta el archivo $archivo respecto a la ultima comprobacion de MD5" >> correo.txt
echo "nombre = $archivo" >> correo.txt
echo "MD5 = $md5" >> correo.txt
cat correo.txt | /usr/sbin/sendmail -t
recalculo=1
fi
done < $ruta/md5.txt
#compruebo si hay algun archivo nuevo
#obtengo lista de archivo que hay actualmente
ls $ruta -p |grep -v / | grep -v md5.txt > archivosahora.txt
while IFS1= read -r linea1 || [[ -n "$linea1" ]]; do
let existef=0
while IFS= read -r linea || [[ -n "$linea" ]]; do
archivo="${linea:33:200}";
var="$ruta/$linea1"
#echo "$ruta/md5.txt" "$var"
if [ $var = $archivo ]; then
#existe el $archivo en el directorio y en md5
#comparo los MD5 para ver si hay cambios
#echo md5 guardado= "${linea:0:32}"
md5a=$(md5sum $var)
if [ "${linea:0:32}" != "${md5a:0:32}" ]; then
echo "Son diferentes $archivo"
echo "Subject: Un archivo ha cambiado de contenido" > correo.txt
echo "From: $origen" >> correo.txt
echo "To: $destino" >> correo.txt
echo "El $archivo ha cambiado respecto a la ultima comprobacion de MD5" >> correo.txt
echo "nombre = $archivo" >> correo.txt
echo "MD5 original= ${linea:0:32}" >> correo.txt
echo "MD5 actual= ${md5a:0:32}" >> correo.txt
cat correo.txt | /usr/sbin/sendmail -t
recalculo=1
fi
let existef=1
fi
done < $ruta/md5.txt
if [ $existef -eq 0 ]; then
#echo "$linea1 es nuevo y lo añado a md5.txt"
md5sum $var >> $ruta/md5.txt
#envío el correo con el aviso
echo "Subject: Nuevo archivo en el directorio" > correo.txt
echo "From: $origen" >> correo.txt
echo "To: $destino" >> correo.txt
echo "Hay un nuevo archivo $linea1 respecto a la ultima comprobacion de MD5" >> correo.txt
echo "nombre = $ruta/$linea1" >> correo.txt
cat correo.txt | /usr/sbin/sendmail -t
let existef=0
recalculo=1
fi
done < archivosahora.txt
rm archivosahora.txt
if [ -f correo.txt ]; then
rm correo.txt
fi
#Si hay nuevos recalculo md5.txt
#mejorable calculando solo el nuevo md5 y añadiendo solo en nuevo al archivo md5.txt
if [ "$recalculo" = "1" ]; then
#echo "recalculo MD5 porque hay nuevo o falta algún archivo"
for file in $ruta/*; do
md5sum $file;
done > $ruta/md5.txt
fi
else
# Creo el archivo MD5.txt por primera vez
for file in $ruta/*; do
md5sum $file;
done > $ruta/md5.txt
fi