Ich möchte einen Ordner auf meinem Mac (Snow Leopard) ansehen und dann ein Skript ausführen (mit dem Dateinamen dessen, was gerade in einen Ordner verschoben wurde (als Parameter ... x.sh "Dateiname")).
Ich habe ein Skript, das alle in bash (x.sh) geschrieben ist und einige Dateien und andere Dinge bei Eingabe von $ 1 verschiebt. Ich brauche nur OSX, um mir den Dateinamen zu geben, wenn neue Dateien / Ordner in ein Verzeichnis verschoben / erstellt werden.
Irgendein solcher Befehl?
fswatch
unten als Antwort dargestellte util verwendet tatsächlich diese Methode.Antworten:
fswatch
fswatch ist ein kleines Programm, das die Mac OS X FSEvents-API zum Überwachen eines Verzeichnisses verwendet. Wenn ein Ereignis über eine Änderung in diesem Verzeichnis empfangen wird, wird der angegebene Shell-Befehl von ausgeführt
/bin/bash
Wenn Sie mit GNU / Linux arbeiten, bietet inotifywatch (Teil des
inotify-tools
Pakets bei den meisten Distributionen) ähnliche Funktionen.Update:
fswatch
Kann jetzt auf vielen Plattformen verwendet werden, einschließlich BSD, Debian und Windows.Syntax / Ein einfaches Beispiel
Die neue Methode, mit der mehrere Pfade überwacht werden können - für Versionen 1.x und höher :
Der ältere Weg für Versionen 0.x :
Installation mit Homebrew
Ab dem 12.9.13 wurde es wieder zu Homebrew hinzugefügt - yay! Aktualisieren Sie also Ihre Formelliste (
brew update
) und alles, was Sie tun müssen, ist:Installation ohne Homebrew
Geben Sie diese Befehle ein
Terminal.app
Wenn Sie keinen
c
Compiler auf Ihrem System haben, müssen Sie möglicherweise Xcode- oder Xcode-Befehlszeilentools installieren - beide kostenlos. Wenn dies jedoch der Fall ist, sollten Sie sich wahrscheinlich nur Homebrew ansehen .Zusätzliche Optionen für
fswatch
Version 1.x.quelle
make
löst einen Fehler aus, wenn kein Makefile gefunden wird. Glücklicherweise ist fswatch jetzt auf MacPorts verfügbar undsudo port install fswatch
funktioniert auch für diejenigen von uns, die MacPorts anstelle von Homebrew verwenden.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
überwachen einfach das aktuelle Verzeichnis.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
mit-0
für NULL vorschlagen. Dieser arbeitet für mich für weniger ZusammenstellungZu diesem Zweck können Sie launchd verwenden. Launchd kann so konfiguriert werden, dass ein Programm automatisch gestartet wird, wenn ein Dateipfad geändert wird.
Beispielsweise startet die folgende Startkonfigurationsliste das Programm,
/usr/bin/logger
wenn der Desktop-Ordner meines Benutzerkontos geändert wird:Um die Konfigurationsliste zu aktivieren, speichern Sie sie im Ordner LaunchAgents in Ihrem Bibliotheksordner als "logger.plist".
In der Shell können Sie dann mit dem Befehl
launchctl
die Datei logger.plist aktivieren, indem Sie Folgendes ausführen:Der Desktop-Ordner wird jetzt überwacht. Jedes Mal, wenn es geändert wird, sollte eine Ausgabe in der Datei system.log angezeigt werden (verwenden Sie Console.app). Führen Sie Folgendes aus, um die Datei logger.plist zu deaktivieren:
Die obige Konfigurationsdatei verwendet die
WatchPaths
Option. Alternativ können Sie auch dieQueueDirectories
Option verwenden. Weitere Informationen finden Sie in der Manpage launchd .quelle
/usr/bin/logger
mit meinem Bash-Skript wechselte und den"<string>path modified</strong>"
Eintrag entfernte, konnte ich für mein Bash-Skript keine Möglichkeit finden, zu wissen, welche Datei auf meinem Desktop geändert wurde - nur, dass das Ereignis aufgetreten ist. Ich habe versucht , Blick auf$0
,$1
und bekam nur den Namen des Skripts selbst und merkt an sie übergeben.Der über Homebrew erhältliche Facebook- Wächter sieht ebenfalls gut aus. Es unterstützt auch das Filtern:
Beachten Sie, dass der Pfad absolut sein muss.
quelle
Vielleicht möchten Sie sich mein kleines Tool ansehen (und es vielleicht erweitern)
kqwait
. Derzeit sitzt es nur herum und wartet auf ein Schreibereignis in einer einzelnen Datei, aber die Kqueue- Architektur ermöglicht das hierarchische Stapeln von Ereignissen ...quelle
fswatch
(was auch in Ordnung ist, da es ein so leichter Wrapper ist, dass es auch modifiziert werden könnte, um das Richtige zu tun, da bin ich mir sicher), wo es ausgelöst wird, wenn Dinge wiegit status
(die tatsächlich jedes Mal ausgeführt werden, wenn zsh ausgeführt wird) ausgelöst werden Auf meinem Computer wird eine Eingabeaufforderung gerendert ...), die dieses aufwändige Skript, das ich habe, tatsächlich durcheinander bringt, indem eine endlose Rückkopplungsschleife erstellt wird. kqwait liefert jedoch die Informationen über die geänderte Datei und wird nicht von ausgelöstgit status
. Ich brauche es allerdings, um beim Schreiben zu feuern.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog ist eine plattformübergreifende Python-API zum Überwachen von Dateien / Verzeichnissen und verfügt über ein integriertes "Tricks" -Tool, mit dem Sie Aktionen (einschließlich Shell-Befehle) auslösen können, wenn Ereignisse auftreten (einschließlich neu hinzugefügter Dateien, entfernter Dateien und geänderter Dateien).
quelle
Dies ist nur zu erwähnen, dass entr unter OSX eine Alternative ist, um beliebige Befehle auszuführen, wenn sich Dateien ändern. Ich finde es einfach und nützlich.
quelle
Hier ist ein Einzeiler mit
sschober
dem Tool .quelle
$ brew install kqwait
Bearbeiten:
fsw
wurde in zusammengeführtfswatch
. In dieser Antwortfsw
sollte jetzt jeder Verweis auf lautenfswatch
.Ich habe einen
fswatch
Ersatz in C ++ geschrieben,fsw
der mehrere Verbesserungen enthält:Es ist ein GNU Build System-Projekt, das auf jeder unterstützten Plattform (OS X v.> = 10.6) mit aufbaut
Mehrere Pfade können als unterschiedliche Argumente übergeben werden:
Es gibt einen detaillierten Datensatz mit allen Ereignisinformationen aus, z.
Die Ausgabe ist einfach zu analysieren, sodass die
fsw
Ausgabe an einen anderen Prozess weitergeleitet werden kann.-l, --latency
.-n, --numeric
.strftime
Formatzeichenfolgen mit angepasst werden-t, --time-format
.-u, --utc-time
.Fsw bekommen:
fsw
wird auf GitHub gehostet und kann beim Klonen des Repositorys abgerufen werden:Fsw installieren:
fsw
kann mit den folgenden Befehlen installiert werden:Weitere Informationen:
Ich habe auch einen einführenden Blog-Beitrag geschrieben, in dem Sie einige Beispiele zur Funktionsweise finden
fsw
.quelle
Mit Apple OSX- Ordneraktionen können Sie Aufgaben basierend auf Aktionen für einen Ordner automatisieren.
quelle
Meine Fswatch- Gabel bietet die Funktionalität einer
inotifywait -m
etwas weniger (keine Wartezeit, mehr! Ich habe unter Linux viel mehr Probleme mitinotifywait
...) Analyse-freundlichen Ausgabe.Es ist eine Verbesserung gegenüber dem Original,
fswatch
da es den tatsächlichen Pfad der geänderten Datei über STDOUT sendet, anstatt dass Sie ein Programm bereitstellen müssen, das es gabelt.Es war absolut solide als Grundlage für eine Reihe von beängstigenden Bash-Skripten, mit denen ich Dinge automatisiere.
(dies ist nicht zum Thema gehörend)
inotifywait
unter Linux erfordert andererseits eine Menge Kludges, und ich habe immer noch keinen guten Weg gefunden, um es zu verwalten, obwohl ich denke, dass etwas, das darauf basiertnode.js
, das Ticket sein könnte.quelle
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
Ich habe eine GIST dafür und die Verwendung ist ziemlich einfach
Zur Veranschaulichung wird der folgende Befehl
Hello World
jedes Mal wiedergegeben, wenn sich dasfile1
ODERfile2
ändert. und die Standardintervallprüfung ist 1 SekundeWenn ich alle 5 Sekunden überprüfen möchte, kann ich die
-t
Flagge verwenden-v
Aktiviert denverbose
Modus, in dem Debug-Informationen angezeigt werden-q
machtwatchfiles
leise ausführen (#
wird angezeigt, damit der Benutzer sehen kann, dass das Programm ausgeführt wird)-qq
machtwatchfiles
ganz leise ausführen-h
zeigt die Hilfe und Verwendunghttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
quelle
Am Ende habe ich das für macOS gemacht. Ich bin sicher, das ist in vielerlei Hinsicht schrecklich:
quelle
Wenn Sie NodeJS verwenden möchten, können Sie ein Paket namens chokidar (oder tatsächlich chokidar-cli ) zum Ansehen verwenden und dann Folgendes verwenden
rsync
(im Lieferumfang des Mac enthalten):Rsync-Befehl:
$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'
Chokidar cli (global über npm installiert):
chokidar \"**/*\" -c \"your-rsync-command-above\"
quelle
Hier ist eine einfache einzeilige Alternative für Benutzer, die nicht über den
watch
Befehl verfügen und alle 3 Sekunden einen Befehl ausführen möchten:while :; do your-command; sleep 3; done
Es ist eine Endlosschleife, die im Grunde der folgenden entspricht:
watch -n3 your-command
quelle
your-command
Festplatten-E / A ausgeführt werden, ist dies ein garantiertes Lesen / Schreiben der Festplatte alle 3 Sekunden - oder 10.800 Mal pro Stunde. Durch die Verwendung von Dateisystemereignissen wird garantiert, dass E / A (und andere teure Vorgänge) nur dann stattfinden, wenn Sie eine Datei ändern (was im Allgemeinen nur ein paar Mal pro Stunde der Fall ist).watch
vorübergehend etwas tun, um zu sehen, was etwas tut. Ich verwende meine erwähnte Technik nicht für Produktions-Apps oder ähnliches. Zum Beispiel möchte ich den Fortschritt von sehendd
und meine Technik macht es möglich (your-command
gegebenenfalls ersetzen , um das entsprechende Signal an zu sendendd
).