Постійно виявляйте нові файли (файли) за допомогою інструментів inotify у кількох каталогах рекурсивно


17

Я щойно встановив інструменти inotify-інструменти. Я хотів би постійно виявляти нові файли з інструментами notify в декількох каталогах рекурсивно та надсилати електронне повідомлення за допомогою Postfix. Можливо, я можу впоратися з надсиланням електронного листа за допомогою частини Postfix. Я просто намагаюся розібратися з найкращим способом вирішити це, намагаючись виявити нові файли. Тому що іноді додається відразу кілька файлів.

Відповіді:


39

inotifywait (частина inotify-tools ) - це правильний інструмент для досягнення вашої мети, неважливо, що декілька файлів створюються одночасно, він їх виявить.

Ось зразок сценарію:

#!/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" "yourmail@addresshere.tld"
done

inotifywait використовуватиме ці параметри.

-m для моніторингу режиму нескінченно, якщо ви не використовуєте цю опцію, як тільки він виявить новий файл, сценарій закінчиться.

-r буде ревізувати файли рекурсивно (якщо багато dirs / файлів, це може зайняти деякий час, щоб виявити нові створені файли)

-e create - це можливість вказати подію для моніторингу, і у вашому випадку її слід створити, щоб подбати про нові файли

--формат '% w% f' роздрукує файл у форматі /complete/path/file.name

"$ {MONITORDIR}" - це змінна, що містить шлях для моніторингу, який ми визначили раніше.

Тож у випадку, якщо буде створений новий файл, inotifywait виявить його та надрукує вихід (/complete/path/file.name) у трубу і одночасно призначить цей вихід змінній NEWFILE .

Всередині циклу while ви побачите спосіб надсилання пошти на вашу адресу за допомогою утиліти mailx, яка повинна добре працювати з вашим локальним MTA (у вашому випадку Postfix).

Якщо ви хочете контролювати декілька каталогів, inotifywait не дозволяє, але у вас є два варіанти, створіть сценарій для кожного dir для моніторингу або створіть функцію всередині сценарію, приблизно так:

#!/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" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

Я забув додати кілька пояснень щодо команд, які використовуються у зразковому скрипті, що є причиною для редагування моєї відповіді ... Я також додав сценарій у випадку, якщо оп хоче контролювати кілька режимів. Щодо інструменту inotifywait, то неможливо відповісти на це питання без його згадування, оскільки op використовує інструменти inotifywait. До речі, я тут новачок, тому мені потрібно багато чого навчитися щодо етикету, тож, вибачте, якщо моя відповідь перекриває вашу, це було не те, що я хочу, я просто хочу дати повну відповідь на оп. Знову вибачте.
sahsanu

Без проблем і ласкаво просимо до SU. Дізнатися про етикет звичайно робиться важким способом, оскільки його насправді ніде не визначено.
harrymc

4
@sahsanu Я не згоден з усією справою "нетикет". Кожна людина відповідає на питання звідти з власної точки зору. Між відповідями немає перекриття, а також відповіді, яка була переписана. Неможливо, щоб відповіді відрізнялися таким чином, коли питання настільки специфічне. Дуже дякую, що знайшли час, щоб відповісти на питання дуже детально. Це допомогло більше, ніж ви знаєте, для когось, як я, який тільки про все це дізнається. Ти врятував мене незліченну кількість годин.
Девід Кастер


Нетикет в умовах, що розвивається, не може бути абсолютно визначений. На цьому сайті прийнято не дублювати відповіді, якщо вони погано написані, і навіть тоді рекомендується виправити їх замість цього шляхом редагування. У демократичній громаді завжди є ваше право не погоджуватися. @sahsanu міг уникнути мого зауваження, посилаючись на мою попередню відповідь, показуючи його сценарій, який отримав би ваше схвалення в будь-якому випадку. Це я зробив би на його місці, і це мій етикет, яким я вважаю, що ділюсь з іншими (але, звичайно, не з усіма).
harrymc

8

Використовуйте inotifywait , наприклад:

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

Для отримання додаткової інформації та прикладів дивіться статтю
Як використовувати inotify-інструменти для запуску скриптів на події файлової системи .


1
Якщо хтось використовує це і перетворить змінні з прочитаного у великі регістри, ви не зможете запускати деякі команди всередині цього часу. Це тому, що ви перезаписали б змінну $ PATH.
Савагеман

2
@Savageman Використання великих імен змінних для власних змінних сильно не рекомендується саме з цієї причини. Великі імена змінних зарезервовані для використання в системі; ваші власні змінні повинні використовувати малі регістри.
трійка

@tripleee Дякую за інформацію, більше не використовуватиму великі
регістри

0

Для кількох каталогів ви можете це зробити:

#!/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" "yourmail@addresshere.tld"
  done
          }


monitor &

Ось приклад списку папок у файлі /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.