342 votes

Existe-t-il une commande comme "watch" ou "inotifywait" sur le Mac?

Je veux regarder un dossier sur mon Mac (Snow Leopard) et ensuite exécuter un script (en lui donnant le nom de fichier qui vient d'être déplacé dans un dossier (comme paramètre ... x.sh "nomfichier")).

J'ai un script tout écrit dans bash (x.sh) qui va déplacer certains fichiers et autres choses sur l'entrée $ 1 J'ai juste besoin d'OSX pour me donner le nom du fichier lorsque de nouveaux fichiers / dossiers sont déplacés / créés dans un répertoire.

Une telle commande?

522voto

cwd Points 8723

fswatch

fswatch est un petit programme à l'aide de Mac OS X FSEvents API pour surveiller un répertoire. Lorsqu'un événement de tout changement à ce répertoire est reçu, la commande shell est exécuté par /bin/bash

Si vous êtes sous GNU/Linux, inotifywatch (une partie de la inotify-tools paquet sur la plupart des distributions) offre les mêmes la fonctionnalité.

Mise à jour: fswatch peuvent maintenant être utilisées dans de nombreuses plates-formes, y compris les systèmes BSD et Debian.

La Syntaxe De / Un Exemple Simple

La nouvelle façon de regarder plusieurs chemins d'accès - pour les versions 1.x et supérieur:

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

L'ancienne façon pour les versions 0.x:

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


Installation avec Homebrew

Comme de 9/12/13 il a de nouveau été ajoutée à homebrew - yay! Donc, mettre à jour votre liste de formules (brew update) et puis tout ce que vous devez faire est de:

brew install fswatch

Qui s'installe en 2 secondes (littéralement):

screenshot-with-shadow.png

Installation sans Homebrew

Tapez ces commandes dans Terminal.app

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

Si vous n'avez pas de c compilateur sur votre système, vous devez peut-être installer Xcode ou Xcode outils de ligne de commande - deux gratuit. Cependant, si c'est le cas, vous devriez probablement vérifier homebrew.

Des Options supplémentaires pour l' 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.

105voto

sakra Points 13373

Vous pouvez utiliser launchd . Launchd peut être configuré pour lancer automatiquement un programme lorsqu'un chemin d'accès au fichier est modifié.

Par exemple les éléments suivants launchd config plist va lancer le programme /usr/bin/logger lorsque le dossier sur le bureau de mon compte d'utilisateur est modifié:

<?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>

Pour activer la config plist de l'enregistrer à l'LaunchAgents dossier dans votre dossier de Bibliothèque comme "logger.plist".

À partir du shell que vous pouvez ensuite utiliser la commande launchctl pour activer l'enregistreur de données.plist en cours d'exécution:

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

Le bureau le dossier est maintenant surveillé. Chaque fois qu'il est modifié, vous devez voir une sortie dans le système.log (utilisation de la Console.app). Pour désactiver la journalisation.plist, exécutez:

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

Le fichier de configuration ci-dessus utilise l' WatchPaths option. Sinon, vous pouvez également utiliser l' QueueDirectories option. Voir la launchd page de manuel pour plus d'informations.

46voto

Jakub Holý Points 941

Facebook du gardien, disponible via Homebrew, est aussi très joli. Il prend également en charge le filtrage:

Ces deux lignes d'établir une veille sur un répertoire source et ensuite définir un trigger nommé "buildme" qui va exécuter un outil nommé "minify-css" chaque fois qu'un fichier CSS est changé. L'outil sera transmis une liste de la changé les noms de fichiers.

$ watchman watch ~/src

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

Notez que le chemin d'accès doit être absolue.

23voto

sschober Points 491

Vous voudrez peut-être examiner (et peut-être élargir) mon petit outil kqwait . Actuellement, il se contente d' attendre un événement d'écriture sur un seul fichier, mais l'architecture kqueue permet d'empiler les événements de manière hiérarchique ...

16voto

gfxmonk Points 2981

watchdog est une API python multi-plateforme pour regarder des fichiers / répertoires, et un outil intégré "trucs" qui vous permet de déclencher des actions (y compris des commandes shell) lorsque des événements se produisent (y compris nouveau fichier ajouté, fichier supprimé et fichier modifié).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X