363 Stimmen

Gibt es einen Befehl wie "watch" oder "inotifywait" auf dem Mac?

Ich möchte einen Ordner auf meinem Mac (Snow Leopard) überwachen und dann ein Skript ausführen (indem ich ihm den Dateinamen dessen gebe, was gerade in einen Ordner verschoben wurde (als Parameter... x.sh "Dateiname")).

Ich habe ein Skript alle in Bash (x.sh) geschrieben, die einige Dateien und andere Sachen auf Eingabe $1 verschieben wird ich brauche nur OSX, um mir den Dateinamen zu geben, wenn neue Dateien/Ordner in ein Verzeichnis verschoben/erstellt werden.

Gibt es einen solchen Befehl?

540voto

cwd Punkte 50020

Fswatch

fswatch ist ein kleines Programm, das die Mac OS X FSEvents API nutzt, um ein Verzeichnis zu überwachen. Wenn ein Ereignis über eine Änderung in diesem Verzeichnis empfangen wird, wird der angegebene Shell-Befehl ausgeführt von /bin/bash

Wenn Sie mit GNU/Linux arbeiten, inotifywatch (Teil des inotify-tools Paket auf den meisten Distributionen) bietet ähnliche Funktionalität.

Aktualisierung: fswatch kann jetzt auf vielen Plattformen verwendet werden, darunter BSD, Debian und Windows.

Syntax / Ein einfaches Beispiel

Der neue Weg, der mehrere Pfade beobachten kann - für Versionen 1.x und höher :

fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh

Hinweis: Die Nummer, die von -o wird an das Ende der Datei xargs Befehl, wenn nicht für die -I{} . Wenn Sie sich dafür entscheiden, diese Nummer zu verwenden, setzen Sie {} irgendwo in Ihrem Kommando.

Der ältere Weg für Versionen 0.x :

fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh

Installation mit Homebrew

Seit dem 12.9.13 wurde sie wieder in die Datenbank aufgenommen. selbstgebaut - juhu! Also, aktualisieren Sie Ihre Formelliste ( brew update ) und dann müssen Sie nur noch Folgendes tun:

brew install fswatch

Installation ohne Homebrew

Geben Sie diese Befehle ein Terminal.app

cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch

Wenn Sie keine c Compiler auf Ihrem System benötigen, müssen Sie möglicherweise Xcode oder die Xcode-Befehlszeilentools installieren - beide sind kostenlos. Wenn dies jedoch der Fall ist, sollten Sie wahrscheinlich nur Homebrew ausprobieren .

Zusätzliche Optionen für fswatch Version 1.x

Usage:
fswatch [OPTION] ... path ...

Options:
 -0, --print0          Use the ASCII NUL character (0) as line separator.
 -1, --one-event       Exit fsw after the first set of events is received.
 -e, --exclude=REGEX   Exclude paths matching REGEX.
 -E, --extended        Use exended regular expressions.
 -f, --format-time     Print the event time using the specified format.
 -h, --help            Show this message.
 -i, --insensitive     Use case insensitive regular expressions.
 -k, --kqueue          Use the kqueue monitor.
 -l, --latency=DOUBLE  Set the latency.
 -L, --follow-links    Follow symbolic links.
 -n, --numeric         Print a numeric event mask.
 -o, --one-per-batch   Print a single message with the number of change events.
                       in the current batch.
 -p, --poll            Use the poll monitor.
 -r, --recursive       Recurse subdirectories.
 -t, --timestamp       Print the event timestamp.
 -u, --utc-time        Print the event time as UTC time.
 -v, --verbose         Print verbose output.
 -x, --event-flags     Print the event flags.

See the man page for more information.

108voto

sakra Punkte 57239

Sie können verwenden launchd zu diesem Zweck. Launchd kann so konfiguriert werden, dass ein Programm automatisch gestartet wird, wenn ein Dateipfad geändert wird.

Die folgende launchd-Konfigurationsliste zum Beispiel startet das Programm /usr/bin/logger wenn der Desktop-Ordner meines Benutzerkontos geändert wird:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>logger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/logger</string>
        <string>path modified</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/sakra/Desktop/</string>
    </array>
</dict>
</plist>

Um die Konfigurationsliste zu aktivieren, speichern Sie sie im Ordner "LaunchAgents" in Ihrem Bibliotheksordner als "logger.plist".

In der Shell können Sie dann den Befehl launchctl um die logger.plist durch Ausführen zu aktivieren:

$ launchctl load ~/Library/LaunchAgents/logger.plist

Der Desktop-Ordner wird nun überwacht. Jedes Mal, wenn er geändert wird, sollten Sie eine Ausgabe in der system.log sehen (verwenden Sie Console.app). Um die logger.plist zu deaktivieren, führen Sie aus:

$ launchctl unload ~/Library/LaunchAgents/logger.plist

Die obige Konfigurationsdatei verwendet die WatchPaths Option. Alternativ dazu können Sie auch die Option QueueDirectories Option. Siehe die launchd Manpage für weitere Informationen.

53voto

Jakub Holý Punkte 5625

Facebooks Wächter das über Homebrew verfügbar ist, sieht ebenfalls gut aus. Es unterstützt auch Filterung:

Mit diesen beiden Zeilen wird eine Überwachung der einen Auslöser namens "buildme" ein, der ein Werkzeug namens "minify-css" ausführt ausführt, sobald eine CSS-Datei geändert wird. Dem Werkzeug wird eine Liste der geänderten Dateinamen übergeben.

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

Beachten Sie, dass der Pfad absolut sein muss.

24voto

sschober Punkte 1923

Vielleicht möchten Sie einen Blick auf mein kleines Tool werfen (und es vielleicht erweitern) kqwait . Derzeit wartet es nur auf ein Schreibereignis für eine einzelne Datei, aber die kqueue Architektur ermöglicht eine hierarchische Stapelung von Ereignissen...

17voto

gfxmonk Punkte 8312

Watchdog ist eine plattformübergreifende Python-API zum Überwachen von Dateien/Verzeichnissen und verfügt über ein eingebautes "Tricks"-Tool, mit dem Sie Aktionen (einschließlich Shell-Befehle) auslösen können, wenn Ereignisse auftreten (einschließlich neu hinzugefügter, entfernter und geänderter Dateien).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X