Erkennen Sie fortlaufend neue Dateien mit inotify-tools in mehreren Verzeichnissen rekursiv

33890
David Custer

Ich habe gerade inotify-tools installiert. Ich möchte ständig neue Dateien mit Benachrichtigungswerkzeugen in mehreren Verzeichnissen rekursiv erkennen und eine E-Mail mit Postfix senden. Ich kann wahrscheinlich mit dem Senden einer E-Mail mit dem Postfix-Teil umgehen. Ich versuche nur herauszufinden, wie Sie am besten nach neuen Dateien suchen können. Weil manchmal mehrere Dateien gleichzeitig hinzugefügt werden.

11

4 Antworten auf die Frage

32
sahsanu

Inotifywait (Teil von Inotify-Tools ) ist das richtige Werkzeug, um Ihr Ziel zu erreichen. Es spielt keine Rolle, dass mehrere Dateien gleichzeitig erstellt werden, sie werden sie erkennen.

Hier ein Beispielskript:

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

Inotifywait verwendet diese Optionen.

-m um das Verzeichnis unbegrenzt zu überwachen, wenn Sie diese Option nicht verwenden, wird das Skript beendet, sobald eine neue Datei gefunden wurde.

-r überwacht Dateien rekursiv (bei vielen Verzeichnissen / Dateien kann es eine Weile dauern, bis die neu erstellten Dateien erkannt werden)

-e create ist die Option zum Festlegen des zu überwachenden Ereignisses. 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

"$ " ist die Variable, die den Pfad enthält, den Sie zuvor überwacht haben.

So in dem Fall, dass eine neue Datei erstellt wird, wird es inotifywait erkennen und wird die Ausgabe drucken (/complete/path/file.name) an das Rohr und wird, während die Ausgabe an variable NEWFILE zuweisen .

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) einwandfrei funktionieren sollte.

Wenn Sie mehrere Verzeichnisse überwachen möchten, lässt dies inotifywait dies nicht zu. Sie haben jedoch zwei Optionen. Erstellen Sie ein Skript für jedes Verzeichnis, das Sie überwachen möchten, 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 $ has been created" "yourmail@addresshere.tld" done } monitor "$MONITORDIR1" & monitor "$MONITORDIR2" & monitor "$MONITORDIRX" & 
Ich habe vergessen, einige Erklärungen zu den im Beispielskript verwendeten Befehlen hinzuzufügen. Dies ist der Grund, um meine Antwort zu bearbeiten. Ich habe auch das Skript hinzugefügt, falls op mehrere Verzeichnisse überwachen möchte. Was das inotifywait-Tool betrifft, ist es unmöglich, die Frage ohne Erwähnung zu beantworten, da op inotify-tools verwendet. Übrigens, ich bin ein Neuling hier, also muss ich viel über die Netiquette lernen. Tut mir Leid, wenn meine Antwort sich mit Ihrer überschneidet. Ich wollte nicht, dass ich nur eine vollständige Antwort auf Op geben möchte. Nochmals Entschuldigung. sahsanu vor 8 Jahren 0
Kein Problem und herzlich willkommen in SU. Das Erlernen der Netiquette wird normalerweise auf die harte Tour durchgeführt, da sie nirgendwo wirklich definiert ist. harrymc vor 8 Jahren 0
@sahsanu Ich stimme nicht mit der ganzen "Netiquette" -Sache überein. Jede Person beantwortet die Frage aus ihrer eigenen Perspektive. Es gibt keine Überschneidungen zwischen Antworten und auch keine 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 du weißt, für jemanden wie mich, der gerade alles darüber lernt. Du hast mir unzählige Stunden gespart. David Custer vor 8 Jahren 4
@harrymc [Netiquetta wird hier definiert.] (https://www.google.com/search?site=&source=hp&q=what+is+netiquette&oq=what+is+netiquette&gs_l=hp.3..35i39l2j0i20j0l7.476.1825. 0.1859.10.9.0.0.0.0.347.902.0j4j0j1.5.0 .... 0 ... 1c.1j2.64 hp.6.4.788.0.lN_f2LHH2MM) David Custer vor 8 Jahren 1
Die Netiquette in einer sich entwickelnden Umgebung kann nicht absolut definiert werden. Es ist üblich, Antworten auf dieser Website nicht zu duplizieren, es sei denn, sie sind schlecht geschrieben, und selbst dann ist es ratsam, sie stattdessen durch Editieren zu korrigieren. Es ist immer Ihr Recht in einer demokratischen Gemeinschaft, nicht zuzustimmen. @sahsanu hätte meine Bemerkung vermeiden können, indem er sich auf meine vorherige Antwort bezogen hätte, während er sein Skript gezeigt hätte, das auf jeden Fall Ihre Zustimmung erhalten hätte. Das hätte ich an seiner Stelle getan, und das ist meine Netiquette, von der ich glaube, dass ich sie mit anderen teile (natürlich nicht mit jedem). harrymc vor 8 Jahren 0
Müsste ich dieses Skript von Crontab aus aufrufen? a coder vor 7 Jahren 0
@acoder Nein, Sie sollten es nicht mit crontab aufrufen. Nun, es hängt davon ab, ob Sie den Parameter -m verwenden, der ausgeführt wird, nachdem er die erste erstellte Datei erkannt hat. Wenn Sie jedoch den Parameter -m nicht verwenden, wird er verwendet end Sobald die erste erstellte Datei erkannt wird, meine ich, wenn Sie das Skript alle x Stunden, Tage usw. mithilfe von crontab ausführen, erhalten Sie doppelte Prozesse, was nicht gut ist. Sie sollten einen Dienst erstellen, um ihn nach dem Starten Ihres Computers zu starten, oder rufen Sie ihn manuell auf. sahsanu vor 7 Jahren 0
6
harrymc

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
Verwendung von inotify-tools zum Auslösen von Skripts für Dateisystemereignisse .

Wenn jemand dies verwendet und die Variablen aus den Großbuchstaben konvertiert, können Sie in der Zwischenzeit keine Befehle ausführen. Dies liegt daran, dass Sie die Variable $ PATH überschreiben würden. Savageman vor 8 Jahren 1
@Savageman Die Verwendung von Variablennamen in Großbuchstaben für Ihre eigenen Variablen wird gerade deshalb dringend empfohlen. Variablennamen in Großbuchstaben sind für die Systemnutzung reserviert. Ihre eigenen Variablen sollten Kleinbuchstaben verwenden. tripleee vor 8 Jahren 2
@tripleee Danke für die Info, verwende keine Großbuchstaben mehr :) Savageman vor 8 Jahren 0
0
Konstantin Frank

Für mehrere Verzeichnisse können Sie Folgendes 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 $ has been created" "yourmail@addresshere.tld" done }   monitor & 

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

/home/user1 /path/to/folder2/ /some/path/ 
-1
igtoth

Keine Rückkehr für mich.

Linux thinkcentre2 4.13.0-16-generic # 19-Ubuntu SMP Mi Okt 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux

inotifywait 3.14