Necesito escribir un script para trabajar en CentOS que verifique periódicamente (quizás cada 3 horas) si una carpeta contiene archivos con ciertas cadenas en el nombre de archivo (como cliente1 y cliente2) y si no, debería enviar un correo a una determinada dirección.

Ya descubrí cómo encontrar archivos con una determinada cadena en el nombre del archivo:

#!/bin/bash

source="/FILES/user/directory1"

string="customer1"

for file in "$source"/*; do
  if [[ $file =~ $string ]]; then

    echo "do something"

  fi
done

¿Cómo verifico periódicamente y cómo busco más de una cadena?

Gracias

1
M. Ibrahim 22 feb. 2018 a las 12:18

2 respuestas

La mejor respuesta

En primer lugar, su servidor debe poder enviar correos electrónicos utilizando cualquier MTA (Mail Transfer Agent), me refiero a tener conexión a un servidor SMTP y tener archivos MTA configurados ...

Supondré que su servidor ha configurado postfix y está funcionando, prefiero usar el comando find para su script:

#!/bin/bash
Source="/FILES/user/directory1"
string="customer1"
mail="yourmail@maildomain.com"

Count=$(find $Source -type f -name "$string" | wc -l)

if [ "$Count" -gt 0 ]
        then
        echo "Number of files matching $string is $Count"
else
        echo "Sending mail to $mail, files don't match with customer string"
        echo "Filenames don't match with $string" | sendmail -t $mail
fi

Si desea esta comprobación cada 3 horas, prefiero recomendar configurar un cronjob como este en un archivo nuevo /etc/cron.d/checkFiles

# m h dom mon dow user  command
0 */3 * * *     root   YourScriptLocation.sh >> /var/log/checkFiles.log 2>&1

He configurado crontab con el usuario root, aunque puedes configurar el trabajo con cualquier usuario que tenga permisos para ejecutar un script, comprobar archivos en el directorio $Source y enviar correo.

1
Alvaro Niño 22 feb. 2018 a las 11:07

Solo estoy agregando el requisito faltante a la respuesta de Alvaro Nino. Consulte mi comentario en el código para comprender cómo está funcionando este script.

#!/bin/bash
Source="/FILES/user/directory1"
file="customer*" #Not only single file all customer files need to search
string="yoursearchstring" 
mail="yourmail@maildomain.com"

Count=$(find $Source -type f -name "$file" |xargs grep [y]oursearchstring | wc -l)
#Above command find files with name "customer*" in current directory as well as in all 
#sub directories inside the parent directory and provide each file as parameter to 
#grep command. grep command will search for the string in each file and wc-l will finally 
#count the number of occurrence of the string in it
if [ "$Count" -gt 0 ]
        then
        echo "Sending mail to $mail, number of files matching $Count"
        echo "Number of files matching $string is $Count" | sendmail -t  $mail
else
     echo "Files doesn't match with string"
fi 
0
Abhijit Pritam Dutta 22 feb. 2018 a las 10:17