Gibt es einen Befehl wie „Uhr“ oder „inotifywait“ auf dem Mac?
Frage
Ich möchte einen Ordner auf meinem Mac (Snow Leopard) sehen und dann ein Skript auszuführen (es den Dateinamen zu geben, was gerade in einen Ordner verschoben (als Parameter ... x.sh „Dateiname“)).
Ich habe ein Skript alle in bash (x.sh) geschrieben, dass einige Dateien und andere Sachen auf Eingabe bewegt 1 $ ich OSX brauchte nur mir die Dateinamen zu geben, wenn neue Dateien / Ordner verschoben werden / in ein Verzeichnis erstellt .
Ein solcher Befehl?
Lösung
fswatch
fswatch ist ein kleines Programm, das Mac OS X FSEvents API überwacht ein Verzeichnis verwenden.
Wenn ein Ereignis über jede Änderung dieses Verzeichnisses empfangen wird, die angegeben
Shell-Befehl wird durch /bin/bash
ausgeführt
Wenn Sie auf GNU / Linux,
inotifywatch (Teil der
inotify-tools
Paket auf den meisten Distributionen) bietet ähnliche
Funktionalität.
Update:. fswatch
jetzt können über viele Plattformen, darunter BSD, Debian und Windows verwendet werden
Syntax / Ein einfaches Beispiel
Die neue Art und Weise, die 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 Anzahl Ausgabe von
-o
wird bis zum Ende desxargs
Befehls für die-I{}
wenn nicht hinzugefügt bekommen. Wenn Sie wählen diese Nummer, Ort{}
überall in Ihrem Befehl verwenden.
Die ältere Art und Weise für Versionen 0.x :
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Installation mit Homebrew
Ab 9/12/13 wurde hinzugefügt zurück in Homebrew - yay! So aktualisieren Sie Ihre Formelliste (brew update
) und dann alles, was Sie tun müssen, ist:
brew install fswatch
Installation ohne Homebrew
Geben Sie diese Befehle in Terminal.app
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
Wenn Sie keinen c
Compiler auf Ihrem System haben Sie benötigen Xcode oder Xcode Kommandozeilen-Tools installieren - beide frei. Wenn dies jedoch der Fall ist, sollten Sie wahrscheinlich nur überprüfen Homebrew .
Weitere 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.
Andere Tipps
Sie können mit launchd für diesen Zweck. Launchd kann, um automatisch ein Programm starten konfiguriert werden, wenn ein Dateipfad geändert wird.
Zum Beispiel der folgende launchd Config plist wird das Programm /usr/bin/logger
starten, wenn die Desktop-Ordner meines Benutzerkontos geändert:
<?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>
die config plist aktivieren, speichern Sie es zu den Launchagents-Ordner in Ihrem Library-Ordner als "logger.plist".
Von der Shell können Sie dann den Befehl launchctl
verwenden, um den logger.plist, indem Sie zu aktivieren:
$ launchctl load ~/Library/LaunchAgents/logger.plist
Der Desktop-Ordner wird nun überwacht wird. Jedes Mal, es wird geändert, sollten Sie eine Ausgabe in system.log (Verwendung Console.app) sehen. Zur Deaktivierung des logger.plist, Lauf:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
Die Konfigurationsdatei über Anwendungen der WatchPaths
Option. Alternativ können Sie auch die Verwendung
QueueDirectories
Option. Sehen Sie sich die launchd Manpage für weitere Informationen.
Facebook Wächter , erhältlich über Homebrew, sieht auch schön. Es unterstützt auch Filterung:
Diese beiden Linien eine Uhr auf einem Quellverzeichnis aufzubauen und dann eingestellt bis ein Auslöser namens „BuildMe“, die ein Werkzeug „minify-css“ genannt laufen wann immer eine CSS-Datei geändert wird. Das Tool wird eine Liste der übergeben werden geänderte Dateinamen.
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
Beachten Sie, dass der Pfad absolut sein muss.
Watchdog ist ein plattformübergreifende Python-API für Dateien / Verzeichnisse zu beobachten, und es hat builtin „Tricks "Tool, das Sie Trigger-Aktionen (einschließlich Shell-Befehle) erlaubt, wenn Ereignisse auftreten (einschließlich der neuen hinzugefügt Datei, entfernte Datei und geändert Datei).
Dies ist nur zu erwähnen entr als Alternative auf OSX beliebige Befehle, wenn Dateien ändern laufen. Ich finde es einfach und nützlich.
Edit: fsw
wurde verschmolzen zu fswatch
. In dieser Antwort soll jede Bezugnahme auf fsw
jetzt lesen fswatch
.
Ich schrieb einen fswatch
Ersatz in C ++ genannt fsw
, die mehrere Verbesserungen Features:
-
Es ist ein GNU-Build-Systems-Projekt, das auf jeder unterstützten Plattform aufbaut (OS X v.> = 10,6) mit
./configure && make && sudo make install
-
Mehrere Pfade können als unterschiedliche Argumente übergeben werden:
fsw file-0 ... file-n
-
Es Dumps eine detaillierte Aufzeichnung mit allen Ereignisinformationen wie:
Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile
-
Sein Ausgang ist einfach zu parsen, so dass
fsw
Ausgang an einem anderen Prozess geleitet werden kann. - Latency kann mit
-l, --latency
angepasst werden. - Numerische Ereignis-Flags anstelle von Text diejenigen werden kann mit
-n, --numeric
geschrieben. - Das Zeitformat angepasst werden kann
strftime
Format-Strings mit-t, --time-format
verwenden. - Die Zeit kann die lokal Zeit der Maschine (Standard) oder UTC-Zeit mit
-u, --utc-time
.
Getting fsw:
fsw href="https://github.com/emcrisostomo/fsw" rel="nofollow"> auf GitHub gehostet und kann seine Repository erhalten werden Klonen:
git clone https://github.com/emcrisostomo/fsw
Installieren von fsw:
fsw
installiert werden kann, die folgenden Befehle:
./configure && make && sudo make install
Weitere Informationen:
Ich schrieb auch einen Einführungs Blog Post , wo Sie ein paar Beispiele, wie fsw
Werke finden.
Apple-OSX Ordneraktionen gestatten, Aufgaben zu automatisieren basierend auf Aktionen auf einem Ordner zur Kenntnis genommen.
Meine Gabel von fswatch bietet die Funktionalität von inotifywait -m
mit weniger leicht (ohne Wartezeit, mehr! Ich habe viel mehr Probleme auf Linux mit inotifywait
...) Parse freundliche Ausgabe.
Es ist eine Verbesserung gegenüber dem ursprünglichen fswatch
, weil sie den tatsächlichen Pfad der geänderten Datei über STDOUT sendet, anstatt Sie benötigen ein Programm zur Verfügung zu stellen, dass er sich gabelt.
Es war felsenfest wie die Gründung einer Reihe von scary Bash-Skripte ich Sachen zu automatisieren.
(dies ist off-topic) inotifywait
unter Linux, auf der anderen Seite, eine Menge kludges auf es erfordert, und ich habe immer noch keine gute Art und Weise zu verwalten herausgefunden, obwohl ich etwas denke, basierend auf node.js
könnte die Richtige sein.
Ich habe einen GIST für diese und die Nutzung ist sehr einfach
watchfiles <cmd> <paths...>
Zur Veranschaulichung der folgende Befehl echo Hello World
jedes Mal, dass file1
ODER file2
Änderung; und das Standardintervall ist 1 Sekunde Prüfung
watchfiles 'echo Hello World' /path/to/file1 /path/to/file2
Wenn ich alle 5 Sekunden überprüfen will, kann ich den -t
Flag verwenden
watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2
-
-v
ermöglicht dieverbose
Modus, die zeigt, Debug-Informationen -
-q
watchfiles
ausführen macht leise (#
gezeigt wird, so dass der Benutzer das Programm sehen können, ausgeführt wird) -
-qq
macht ganz leisewatchfiles
ausführen -
-h
zeigt die Hilfe und Verwendung
https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
beendete ich für macOS tun dies auf. Ich bin sicher, dass dies in vielerlei Hinsicht schrecklich ist:
#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
echo "Use like this:"
echo " $0 filename-to-watch command-to-run"
exit 1
fi
if which fswatch >/dev/null; then
echo "Watching $1 and will run $2"
while true; do fswatch --one-event $1 >/dev/null && $2; done
else
echo "You might need to run: brew install fswatch"
fi
Hier ist eine einfache einzelne Zeile Alternative für Anwender, die nicht über die watch
Befehl, der ein Befehl alle 3 Sekunden ausgeführt werden soll:
while :; do your-command; sleep 3; done
Es ist eine unendliche Schleife, die wie Sie folgendermaßen vorgehen grundsätzlich die gleiche ist:
watch -n3 your-command