Ich habe diese Antwort gesehen .
Sie sollten in Betracht ziehen, inotifywait als Beispiel zu 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 für die Erstellung von Dateien eines beliebigen Typs überwacht, aber wie ändere ich den inotifywait
Befehl, um nur zu melden, wenn eine Datei eines bestimmten Typs / einer bestimmten Erweiterung erstellt (oder in das Verzeichnis verschoben) wird - z. B. sollte es melden, wenn eine .xml
Datei erstellt wird.
WAS ICH VERSUCHT HABE:
Ich habe den inotifywait --help
Befehl ausgeführt und die Befehlszeilenoptionen gelesen. Es hat --exclude <pattern>
und --excludei <pattern>
Befehle zum EXCLUDE von Dateien bestimmter Typen (mit regEx), aber ich brauche eine Möglichkeit, nur die Dateien eines bestimmten Typs / einer bestimmten Erweiterung zu INCLUDE .
quelle
path
obigen Option wahrscheinlich nicht der beste Variablenname, wenn Sie zuerst in einer Shell damit spielen möchten. Wenn Sie es verwenden, können Sie nicht alle Befehle verwenden, da dies im Grunde genommen nur den Standard überschrieben hatPATH
. Daher empfehle ich, stattdessen einen alternativen Variablennamen zufpath
verwenden. Das heißt,while read fpath action file
jeder Standardbefehl, der normalerweise in Ihrer Shell verfügbar ist, ist weiterhin verfügbar.Antworten:
Bitte beachten Sie, dass dies nicht getesteter Code ist, da ich momentan keinen Zugriff darauf habe
inotify
. Aber so etwas sollte funktionieren:quelle
incron
(hoffe ich nicht).inotify
entwedernohup
mit einem benutzerdefinierten systemd-Dienst. Meistens letzteres.Verwenden Sie ein doppeltes Negativ:
Dies wird nur Javascript-Dateien enthalten
quelle
inotifywait
anstatt eine riesige Ausgabe für alle Dateien zu generieren und danach zu filtern (wie in der anderen Antwort). Ich habe es nicht versucht, aber ich denke, das würde etwas schneller gehen.--exclude
Eingabe, um nach.ext
Dateien zu suchen. Dies wird nur einmal ausgeführt oder in einer for-Schleife?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Ich bin sicher, dass der reguläre Ausdruck optimiert werden kann, aber dieses Baby funktioniert :)Der doppelt negative Ansatz der vorherigen Antwort ist zwar eine gute Idee, da er (wie TMG feststellte) tatsächlich die Filteraufgabe verschiebt
inotifywait
, aber nicht korrekt ist.Wenn beispielsweise eine Datei endet in
as
dann wird es nicht passen ,[^j][^s]$
weil der letzte Buchstabes
nicht übereinstimmt[^s]
, wird daher nicht ausgeschlossen werden.In Booleschen Begriffen
S
lautet die folgende Aussage:und
J
ist die Aussage:dann sollte der Wert des
--exclude
Parameters semantisch gleich seinnot(J and S)
, wie es nach De Morgans Gesetzen istnot(J) or not(S)
.Ein weiteres mögliches Problem ist, dass in
zsh
,$path
eine eingebaute Variable ist, die das Array-Äquivalent von darstellt$PATH
, sodass diewhile read path ...
Zeile völlig durcheinander$PATH
gerät und alles von der Shell aus nicht mehr ausführbar ist.Daher ist der richtige Ansatz:
Beachten Sie das,
.
was danach benötigt wird,[^j]
um sicherzustellen, dass die Übereinstimmung in der vorletzten Position angewendet wird und dass das|
Zeichen (das das oben erwähnte boolesche ODER darstellt) hier nicht maskiert werden sollte, da--exclude
erweiterte reguläre POSIX-Ausdrücke verwendet werden.quelle