Detecta continuamente novo arquivo (s) com inotify-tools dentro de múltiplos diretórios recursivamente

11

Acabei de instalar o inotify-tools. Eu gostaria de continuamente detectar novos arquivos com ferramentas de notificação em vários diretórios recursivamente e enviar um email usando o postfix. Eu provavelmente posso lidar com o envio de um email usando a parte postfix. Eu só estou tentando descobrir a melhor maneira de fazer isso ao tentar detectar novos arquivos. Porque às vezes vários arquivos são adicionados de uma só vez.

    
por David Custer 13.08.2015 / 05:36

4 respostas

32

inotifywait (parte de inotify-tools ) é a ferramenta certa para alcançar seu objetivo , não importa que vários arquivos estejam sendo criados ao mesmo tempo, ele irá detectá-los.

Aqui está um exemplo de script:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done

inotifywait will use these options.

-m to monitor the dir indefinitely, if you don't use this option, once it has detected a new file the script will end.

-r will monitor files recursively (if there are a lot of dirs/files it could take a while to detect the new created files)

-e create is the option to specify the event to monitor and in your case it should be create to take care about new files

--format '%w%f' will print out the file in the format /complete/path/file.name

"${MONITORDIR}" is the variable containing the path to monitor that we have defined before.

So in the event that a new file is created, inotifywait will detect it and will print the output (/complete/path/file.name) to the pipe and while will assign that output to variable NEWFILE.

Inside the while loop you will see a way to send a mail to your address using the mailx utility that should work fine with your local MTA (in your case, Postfix).

Se você quiser monitorar vários diretórios, o inotifywait não permite, mas você tem duas opções, crie um script para cada diretório para monitorar ou criar uma função dentro do script, algo assim:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
    
por 18.08.2015 / 14:34
7

Use inotifywait , por exemplo:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Para mais informações e exemplos, consulte o artigo Como usar o inotify-tools para acionar scripts no sistema de arquivos eventos .

    
por 18.08.2015 / 10:53
0

Para vários diretórios, você pode fazer isso:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
  done
          }


monitor &

Aqui está uma lista de exemplos de pastas no arquivo /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
    
por 06.09.2018 / 16:33
-1

Não há retorno para mim.

Linux thinkcentre2 4.13.0-16-genérico # 19-Ubuntu SMP Qua Out 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux

inotifywait 3.14

    
por 20.11.2017 / 20:06