Kontinuierliche Erkennung neuer Dateien mit inotify-tools in mehreren Verzeichnissen rekursiv

17

Ich habe gerade inotify-tools installiert. Ich möchte kontinuierlich neue Dateien mit Benachrichtigungstools in mehreren Verzeichnissen rekursiv erkennen und eine E-Mail mit Postfix senden. Ich kann wahrscheinlich eine E-Mail mit dem Postfix-Teil senden. Ich versuche nur herauszufinden, wie ich am besten vorgehen kann, wenn ich versuche, neue Dateien zu erkennen. Weil manchmal mehrere Dateien gleichzeitig hinzugefügt werden.

David Custer
quelle

Antworten:

39

inotifywait (Teil von inotify-tools ) ist das richtige Tool, um Ihr Ziel zu erreichen. Es spielt keine Rolle, dass mehrere Dateien gleichzeitig erstellt werden, es erkennt sie.

Hier ein Beispielskript:

#!/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 verwendet diese Optionen.

-m , um das Verzeichnis auf unbestimmte Zeit zu überwachen. Wenn Sie diese Option nicht verwenden, wird das Skript beendet, sobald eine neue Datei erkannt wurde.

-r überwacht Dateien rekursiv (wenn viele Verzeichnisse / Dateien vorhanden sind, kann es eine Weile dauern, bis die neu erstellten Dateien erkannt werden).

-e create ist die Option, um das zu überwachende Ereignis anzugeben. In Ihrem Fall sollte es erstellt werden , um sich um neue Dateien zu kümmern

--format '% w% f' druckt die Datei im Format /complete/path/file.name aus

"$ {MONITORDIR}" ist die Variable, die den zuvor definierten Pfad zur Überwachung enthält.

Wenn also eine neue Datei erstellt wird, erkennt inotifywait diese und druckt die Ausgabe (/complete/path/file.name) an die Pipe und weist diese Ausgabe der Variablen NEWFILE zu .

In der while-Schleife sehen Sie eine Möglichkeit, eine E-Mail mit dem Dienstprogramm mailx an Ihre Adresse zu senden, das mit Ihrem lokalen MTA (in Ihrem Fall Postfix) problemlos funktionieren sollte.

Wenn Sie mehrere Verzeichnisse überwachen möchten, lässt inotifywait dies nicht zu, Sie haben jedoch zwei Möglichkeiten: Erstellen Sie ein Skript für jedes zu überwachende Verzeichnis oder erstellen Sie eine Funktion innerhalb des Skripts.

#!/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" &
sahsanu
quelle
Ich habe vergessen, einige Erklärungen zu den im Beispielskript verwendeten Befehlen hinzuzufügen, die der Grund für die Bearbeitung meiner Antwort sind. Ich habe das Skript auch hinzugefügt, falls op mehrere Verzeichnisse überwachen möchte. In Bezug auf das Inotifywait-Tool ist es unmöglich, die Frage zu beantworten, ohne sie zu erwähnen, da op Inotify-Tools verwendet. Übrigens, ich bin ein Neuling hier, also muss ich viel über Netiquette lernen. Tut mir leid, wenn sich meine Antwort mit Ihrer überschneidet, war es nicht das, was ich wollte. Ich möchte nur eine vollständige Antwort auf op geben. Nochmals Entschuldigung.
Sahsanu
Kein Problem und willkommen in SU. Das Erlernen der Netiquette erfolgt normalerweise auf die harte Tour, da es nirgendwo wirklich definiert ist.
Harrymc
4
@sahsanu Ich bin nicht einverstanden über die ganze "Netiquette" Sache. Jede Person beantwortet die Frage aus ihrer eigenen Perspektive. Es gibt keine Überlappung zwischen den Antworten, noch gibt es eine Antwort, die neu geschrieben wurde. Es ist unmöglich, dass sich die Antworten auf diese Weise unterscheiden, wenn die Frage so spezifisch ist. Vielen Dank, dass Sie sich die Zeit genommen haben, die Frage ausführlich zu beantworten. Dies hat mehr geholfen als Sie wissen, für jemanden wie mich, der gerade etwas darüber lernt. Du hast mir unzählige Stunden gespart.
David Custer
1
@harrymc Netiquetta ist genau hier definiert.
David Custer
Die Netiquette in einer sich entwickelnden Umgebung kann nicht absolut definiert werden. Auf dieser Website ist es üblich, Antworten nur dann zu duplizieren, wenn sie schlecht geschrieben sind. Selbst dann wird empfohlen, sie stattdessen durch Bearbeiten zu korrigieren. In einer demokratischen Gemeinschaft haben Sie immer das Recht, nicht zuzustimmen. @sahsanu hätte meine Bemerkung vermeiden können, indem er sich auf meine vorherige Antwort bezog, während er sein Skript zeigte, das auf jeden Fall Ihre Zustimmung erhalten hätte. Das hätte ich an seiner Stelle getan und das ist meine Netiquette, die ich glaube, mit anderen zu teilen (aber natürlich nicht mit allen).
Harrymc
8

Verwenden Sie inotifywait zum Beispiel:

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

Weitere Informationen und Beispiele finden Sie im Artikel
Verwenden von inotify-tools zum Auslösen von Skripten für Dateisystemereignisse .

harrymc
quelle
1
Wenn jemand dies verwendet und die Variablen aus dem Einlesen in Großbuchstaben konvertiert, können Sie einige Befehle währenddessen nicht ausführen. Dies liegt daran, dass Sie die Variable $ PATH überschreiben würden.
Savageman
2
@Savageman Die Verwendung von Variablennamen in Großbuchstaben für Ihre eigenen Variablen wird gerade aus diesem Grund dringend empfohlen . Namen von Großbuchstaben sind für die Verwendung durch das System reserviert. Ihre eigenen Variablen sollten Kleinbuchstaben verwenden.
Tripleee
@tripleee Danke für die Info, verwendet keine Großbuchstaben mehr :)
Savageman
0

Für mehrere Verzeichnisse können Sie dies tun:

#!/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 &

Hier ist eine Beispielliste der Ordner in der Datei /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Konstantin Frank
quelle