it-swarm.com.de

Verwendung von inotifywait zum Überwachen eines Verzeichnisses zum Erstellen von Dateien einer bestimmten Erweiterung

Ich habe gesehen diese Antwort .

Sie sollten inotifywait als Beispiel verwenden:

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

Meine Frage ist, dass das obige Skript ein Verzeichnis zum Erstellen von Dateien eines beliebigen Typs überwacht. Wie kann ich jedoch den Befehl inotifywait so ändern, dass er nur dann meldet, wenn eine Datei eines bestimmten Typs/einer bestimmten Erweiterung erstellt (oder in das Verzeichnis verschoben) wird? Verzeichnis) - z es sollte melden, wenn .xml Datei wird erstellt.

WAS ICH VERSUCHT HABE :

Ich habe die inotifywait --help Befehl und haben die Befehlszeilenoptionen gelesen. Es hat --exclude <pattern> und --excludei <pattern> Befehle, um [~ # ~] [~ # ~] Dateien bestimmter Typen auszuschließen (unter Verwendung von regEx), aber ich brauche einen Weg, um INCLUDE just = die Dateien eines bestimmten Typs/einer bestimmten Erweiterung.

23
Shy

wie ändere ich den Befehl inotifywait so, dass er nur meldet, wenn eine Datei eines bestimmten Typs/einer bestimmten Erweiterung erstellt wird?

Bitte beachten Sie, dass dies ngetesteter Code ist, da ich momentan keinen Zugriff auf inotify habe. Aber so etwas sollte funktionieren:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done
21
maulinglawns

Verwenden Sie ein doppeltes Negativ:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

Dies schließt nur Javascript-Dateien ein

9
tofsjonas

Der doppelt negative Ansatz von die vorherige Antwort ist zwar eine gute Idee, da er (wie TMG feststellte) die Filteraufgabe tatsächlich auf inotifywait verlagert, aber nicht korrekt ist.

Wenn eine Datei beispielsweise mit as endet, stimmt sie nicht mit [^j][^s]$ Über, da der letzte Buchstabe s nicht mit [^s] Übereinstimmt ausgeschlossen.

In booleschen Begriffen, wenn S die Anweisung ist:

"Der letzte Buchstabe ist s"

und J ist die Aussage:

"Der vorletzte Buchstabe ist j"

dann sollte der Wert des Parameters --exclude semantisch gleich not(J and S) sein, was nach De Morgans Gesetzennot(J) or not(S) ist.

Ein weiteres potenzielles Problem besteht darin, dass in zsh$path Eine integrierte Variable ist, die das Array-Äquivalent von $PATH Darstellt, sodass die Zeile while read path ... Vollständig durcheinander kommt $PATH Und bewirken, dass alles von der Shell nicht mehr ausgeführt werden kann.

Daher ist der richtige Ansatz:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

Beachten Sie das ., Das nach [^j] Erforderlich ist, um sicherzustellen, dass die Übereinstimmung an der vorletzten Position angewendet wird, sowie das Zeichen | (Das den Booleschen Wert darstellt OR oben erwähnt) sollte hier nicht maskiert werden, da --exclude Erweiterte reguläre POSIX-Ausdrücke verwendet.

6
Adam Spiers

--include und --includei sind tatsächliche Optionen in der Master-Version der Binärdateien, zumindest:

https://github.com/rvoicilas/inotify-tools/tree/master

0
ericcurtin