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?

War es hilfreich?

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 des xargs 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.

Sie können einen Blick auf nehmen wollen (und vielleicht erweitern) mein kleines Tool kqwait . Derzeit nur er sitzt herum und wartet auf ein Schreibereignis auf einer einzigen Datei, aber die kqueue Architektur erlaubt für hierarchische Ereignis Stapel ...

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.

Hier ist ein Einzeiler mit sschober 's Werkzeug .

$ while true; do kqwait doc/my_file.md; make; done

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 die verbose 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 leise watchfiles 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top