entr ist das einfachste und komponierbarste Tool zur Benachrichtigung von Dateien, das ich je gesehen habe. Seine Verwendung ist eher für das Ansehen von Dateien als von Verzeichnissen optimiert, kann aber auch Ihren Fall lösen.
Um die hinzugefügte Datei zu erkennen und zu bearbeiten, kombinieren Sie sie mit anderen Tools wie z make
. entr
Sendet den Namen oder ähnliches nicht, läuft einfach so, wie Sie es befohlen haben.
So suchen Sie in einem Verzeichnis nach hinzugefügten Dateien:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
Wenn Sie auch handeln möchten, wenn sich eine vorhandene Datei ändert:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... und hier ist der Schleifenmechanismus nützlich, da der find
Ausdruck erneut ausgeführt wird, wenn eine Datei hinzugefügt wird.
Wenn Sie eine bessere Fehlerbehandlung wünschen und sicherstellen möchten, dass die Dinge nur einmal pro hinzugefügter / entfernter Datei ausgeführt werden, werden die Dinge etwas eigenartig, aber für diese einfachen Fälle ist es brillant.
BEARBEITEN: Wenn Sie dies auf Systemebene tun möchten, zum Beispiel mit Incron , fügen Sie das Skript einfach Ihrem bevorzugten Prozessmanager hinzu (wie s6 , runit , systemd oder sysvinit) und überspringen Sie die Schleife:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
Die exec
und die Prozessersetzung ( <(...)
) sind wichtig, wenn ein Prozessmanager ausgeführt wird, um die Signalisierung ordnungsgemäß zu handhaben (dh um die Shell aus dem Weg zu räumen).