Wie erkenne ich neue Dateien in einem Ordner mit einem Bash- Skript? Ich möchte die Dateien bearbeiten, sobald sie im Ordner angelegt sind. Ist dies möglich oder muss ich ein Skript mit cron planen, das jede Minute nach neuen Dateien sucht?
shell
filesystems
files
directory
monitoring
ihatetoregister
quelle
quelle
Antworten:
Sie sollten als
inotifywait
Beispiel in Betracht ziehen :In Ubuntu
inotifywait
ist dasinotify-tools
Paket vorgesehen. Ab Version 3.13 (aktuell in Ubuntu 12.04)inotifywait
wird der Dateiname ohne die Option -f angegeben. Ältere Versionen müssen möglicherweise erzwungen werden. Was wichtig ist, ist, dass die-e
Option toinotifywait
die beste Methode zum Filtern von Ereignissen ist. Außerdem kann Ihrread
Befehl die Positionsausgabe mehreren Variablen zuweisen, die Sie verwenden oder ignorieren können. Es ist nicht erforderlich, grep / sed / awk zu verwenden, um die Ausgabe vorzuverarbeiten.quelle
inotifywait
war genau das, was ich wollte.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
Also, müssen Sie nur tun,inotifywait -m /path -e create |
ich werde versuchen, diese Antwort zu bearbeiten.fswatch
. Ich habe es nicht geschrieben, aber es ist Open Source und ich benutze es.Ich bevorzuge
incron
, da es einfacher zu handhaben ist. Im Wesentlichen handelt es sich um einen Dienst,inotify
mit dem Sie Konfigurationen einrichten können, um basierend auf Dateiänderungsvorgängen Maßnahmen zu ergreifen.Ex:
Ein vollständiges Beispiel finden Sie hier: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
quelle
Ich habe das gerade ausgedacht und sehe keine großen Probleme damit, abgesehen von einer winzigen Chance, dass Dateien zwischen Überprüfungen fehlen.
Wenn Ihre Dateiverarbeitung nicht zu lange dauert, sollten Sie keine neue Datei verpassen. Sie könnten auch Hintergrundinformationen zu den Aktivitäten anzeigen ... Es ist nicht kugelsicher, dient jedoch einigen Zwecken ohne externe Tools wie inotify.
quelle
inotify
nicht verfügbar. Ich würde nur hinzufügen-type f
, um Dateien herauszufiltern. Andernfalls wird der Ordner ebenfalls zurückgegeben.-f filename
Option ist großartig. Dann bleibt nur noch die Frage, wie dies beim Neustart gestartet werden kann. Ich werde dies mit meiner Solaranlage verwenden,os.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
damit der Mastercomputer beim Erstellen dieser Dateiespeak
die Niederspannung verwendet und ankündigt. Es sendet mir bereits eine E-Mail, aber da mein System die Uhrzeit bereits zur vollen Stunde anzeigt, hat es den Rest. askubuntu.com/questions/977613/…Sie können
watch
in Ihrem Skript verwendenÜberwacht Ihren Ordner und listet Sie alle 0,1 Sekunden auf
Nachteil
Ist nicht in Echtzeit, wenn also eine Datei in weniger als 0,1 Sekunden erstellt und gelöscht wurde, dann würde dies nicht funktionieren,
watch
unterstützt nur mindestens 0,1 Sekunden.quelle
Ich gehe davon aus, dass der Zielordner (der Einfachheit halber nenne ich ihn
isempty
) leer ist und Sie darauf warten, dass eine oder mehrere Dateien dort abgelegt werden.Sie können den folgenden Befehl verwenden:
Nur um zu überprüfen, ob der Ordner noch leer ist, wird eine 0 zurückgegeben, wenn keine neue Datei vorhanden ist (daher ist der
isempty
Ordner noch leer), oder es wird ein Wert größer als 0 zurückgegeben (tatsächlich die Nummer) Dateien im Ordner).Das sagte ein dummer Wenn / Dann-Test kann den Rest der Arbeit machen:
Natürlich muss die
do_something
Funktion die Datei (en) innerhalb desisempty
Ordners manipulieren und sie dann nach der Verarbeitung aus dem Ordner selbst entfernen.Wenn Sie eine Zeile wie die folgende in Ihre crontab einfügen, wird die Prüfung einmal pro Minute ausgeführt und die
do_something
Aktion ausgelöst, wenn der Ordner natürlich nicht leer ist:quelle
ls
für Skripte verwenden. Verwenden Siefind
stattdessen oder einfaches GlobbingWenn Sie neue Dateien erkennen möchten, verarbeiten Sie diese und löschen Sie am Ende die verarbeiteten Dateien. Verwenden Sie dazu die Datei systemd.path . Diese Methode basiert auf inotify. Es gibt eine Option DirectoryNotEmpty, damit systemd Ihr Skript immer dann ausführen kann, wenn Dateien im Verzeichnis erkannt werden. Sie müssen sich daran erinnern, dass es nur funktioniert, wenn Sie verarbeitete Dateien löschen können und das Skript das Verzeichnis leer lässt.
Bereiten Sie zuerst die Datei mymonitor.service vor
Als nächstes gehen Sie zu mymonitor.path, um den Pfad zu definieren
Wenn der Name der .path-Datei mit dem Namen des Dienstes identisch ist, muss der Dienstname nicht in der .path-Datei angegeben werden.
Es basiert auf der Überwachung des Dateizugriffs auf Dummies
quelle
entr
Verwenden
entr
ist der neue Weg, dies zu tun (es ist plattformübergreifend). Beachten Sie,entr
dass Polling nicht verwendet wird, um einen großen Vorteil gegenüber vielen Alternativen zu erzielen.Auf BSD verwendet
pledge(2)
Sie können es mit installieren
Sie können ein Verzeichnis für neue Ergänzungen mit verfolgen
Optionen erklärt (aus den Dokumenten),
quelle
Bash kann das nicht einfach. Sie müssten im Grunde genommen eine Liste aller Dateien im Ordner erstellen, regelmäßig eine neue Liste erstellen und diese vergleichen, um festzustellen, was sich geändert hat.
Was Sie suchen, heißt inotify. Es ist in den Linux-Kernel integriert und Sie können im Grunde dort sitzen und warten, bis etwas passiert. Dann kommt inotify zurück und sagt: "Hey, es gibt eine neue Datei namens foobar."
Um das zu erreichen, was Sie wollen, müssen Sie zu etwas wie Perl wechseln und Linux :: Inotify2 verwenden (Python unterstützt wahrscheinlich auch Inotify, aber ich bin eine Perl-Person).
quelle
Dies funktioniert unter Cygwin und Linux. Einige der vorherigen Lösungen, die eine Datei schreiben, führen zu einem Thrash der Festplatte. Dieses Skript hat dieses Problem nicht:
quelle
Unten finden Sie eine gekürzte Version eines Beispiels für Stackoverflow , das ich getestet und in eines meiner Projekte integriert habe und das die Überwachung bestimmter Verzeichnisse erfordert.
Hier ist ein Link zu einem Skript , das eine geänderte Version von oben verwendet, um Dateien oder Verzeichnisse, die sich im sshfs-Mountpunkt befinden, automatisch zu entschlüsseln. das vorgenannte Projekt.
quelle