web-dev-qa-db-fra.com

Existe-t-il une commande du type "regarder" ou "inotifywait" sur le Mac?

Je souhaite regarder un dossier sur mon Mac (Snow Leopard), puis exécuter un script (en lui donnant le nom du fichier qui vient d'être déplacé dans un dossier (en tant que paramètre ... x.sh "nom du fichier")).

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

Une telle commande?

241
Mint

fswatch

fswatch est un petit programme utilisant l'API FSEvents de Mac OS X pour surveiller un répertoire . Lorsqu'un événement relatif à une modification de ce répertoire est reçu, la commande spécifiéeShell est exécutée par /bin/bash

Si vous êtes sur GNU/Linux, inotifywatch (qui fait partie du paquet inotify-tools sur la plupart des distributions) fournit une fonctionnalité similaire.

Update:fswatch peut maintenant être utilisé sur de nombreuses plateformes, y compris BSD, Debian et Windows.

Syntaxe/Un exemple simple

La nouvelle façon de regarder plusieurs chemins - pour versions 1.x et supérieures:

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

Remarque: Le nombre généré par -o sera ajouté à la fin de la commande xargs s'il ne s'agit pas du -I{}. Si vous choisissez d'utiliser ce numéro, placez {} n'importe où dans votre commande.

L'ancienne méthode pour versions 0.x:

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

Installation avec Homebrew

En date du 12/09/13, il a été ajouté à homebrew - yay! Donc, mettez à jour votre liste de formules (brew update) et tout ce que vous avez à faire est:

brew install fswatch

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 compilateur c sur votre système, vous devrez peut-être installer des outils de ligne de commande Xcode ou Xcode, tous deux gratuits. Cependant, si tel est le cas, vous devriez probablement vous contenter de vérifier homebrew .

Options supplémentaires pour 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.
378
cwd

Vous pouvez utiliser launchd à cette fin. Launchd peut être configuré pour lancer automatiquement un programme lorsqu'un chemin de fichier est modifié.

Par exemple, la pliste de configuration launchd suivante lancera le programme /usr/bin/logger lorsque le dossier de bureau de mon compte 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 configuration, enregistrez-la dans le dossier LaunchAgents de votre dossier Bibliothèque sous le nom "logger.plist".

À partir du shell, vous pouvez ensuite utiliser la commande launchctl pour activer le fichier logger.plist en exécutant:

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

Le dossier du bureau est maintenant surveillé. Chaque fois qu'il est modifié, vous devriez voir une sortie dans le fichier system.log (utilisez Console.app). Pour désactiver le logger.plist, exécutez:

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

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

88
sakra

Facebook's watchman , disponible via Homebrew, a également l’air agréable. Il prend également en charge le filtrage:

Ces deux lignes établissent une surveillance sur un répertoire source, puis définissent un déclencheur nommé "buildme" qui exécutera un outil nommé "minify-css" chaque fois qu'un fichier CSS est modifié. L'outil recevra une liste des fichiers changé de nom de fichier.

$ watchman watch ~/src

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

Notez que le chemin doit être absolu.

21
Jakub Holý

Vous voudrez peut-être jeter un coup d’œil sur (et peut-être développer) mon petit outil kqwait . Actuellement, il se contente d'attendre un événement d'écriture sur un seul fichier, mais l'architecture kqueue permet la pile d'événements hiérarchiques ...

20
sschober

watchdog est une API python multiplateforme pour la surveillance des fichiers/répertoires. Il possède un outil "astuces" intégré qui vous permet de déclencher des actions (y compris des commandes Shell) lorsque des événements se produisent (y compris un nouveau fichier ajouté, un fichier supprimé et modifié). fichier).

14
gfxmonk

Ceci est juste pour mentionner entr comme une alternative sur OSX pour exécuter des commandes arbitraires lorsque les fichiers changent. Je trouve cela simple et utile.

6
Donny Winston

Voici un one-liner utilisant sschober 's's tool .

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

Edit:fsw a été fusionné avec fswatch . Dans cette réponse, toute référence à fsw devrait maintenant se lire fswatch.

J'ai écrit un remplacement fswatch en C++ appelé fsw qui comporte plusieurs améliorations:

  • Il s’agit d’un projet GNU Build System reposant sur n’importe quelle plate-forme prise en charge (OS X v.> = 10.6) avec

    ./configure && make && Sudo make install
    
  • Plusieurs chemins peuvent être passés en tant qu'arguments différents:

    fsw file-0 ... file-n 
    
  • Il sauvegarde un enregistrement détaillé avec toutes les informations sur l'événement, telles que:

    Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 
    
  • Sa sortie est facile à analyser, de sorte que la sortie fsw puisse être redirigée vers un autre processus.

  • La latence peut être personnalisée avec -l, --latency.
  • Les drapeaux d'événement numériques peuvent être écrits à la place de ceux textuels avec -n, --numeric.
  • Le format de l'heure peut être personnalisé à l'aide de chaînes au format strftime avec -t, --time-format.
  • L'heure peut être l'heure locale de la machine (par défaut) ou l'heure UTC avec -u, --utc-time.

Obtenir fsw:

fsw est hébergé sur GitHub et peut être obtenu en clonant son référentiel:

    git clone https://github.com/emcrisostomo/fsw

Installation de fsw:

fsw peut être installé à l'aide des commandes suivantes:

    ./configure && make && Sudo make install

Informations complémentaires:

J'ai également écrit une introduction { article de blog } _ où vous pouvez trouver quelques exemples sur la façon dont fonctionne fsw.

3
Enrico M. Crisostomo

Apple OSX Actions sur les dossiers vous permet d'automatiser les tâches en fonction des actions effectuées sur un dossier.

2
Asaph

Mon fork de fswatch fournit les fonctionnalités de inotifywait -m avec un peu moins (sans attendre, plus! J'ai beaucoup plus de problèmes sous Linux avec inotifywait...), une sortie conviviale pour l'analyse. 

Il s'agit d'une amélioration par rapport à la fswatch d'origine car elle envoie le chemin réel du fichier modifié via STDOUT au lieu de vous obliger à fournir un programme qu'il lance. 

C’est la base solide d’une série de scripts effrayants que j’utilise pour automatiser des tâches. 

inotifywait sous Linux, par contre, nécessite beaucoup de kludges et je n’ai toujours pas trouvé le moyen de le gérer, bien que je pense que quelque chose basé sur node.js pourrait être le billet.

2
Steven Lu

J'ai un Gist pour cela et l'utilisation est assez simple

watchfiles <cmd> <paths...>

Pour illustrer cela, la commande suivante fera écho à Hello World chaque fois que file1 OR file2 change; et la vérification d'intervalle par défaut est 1 seconde

watchfiles 'echo Hello World' /path/to/file1 /path/to/file2 

Si je veux vérifier toutes les 5 secondes, je peux utiliser le drapeau -t

watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -v active le mode verbose qui affiche des informations de débogage
  • -q rend watchfiles exécuter silencieusement (# sera affiché pour que l'utilisateur puisse voir que le programme est en cours d'exécution)
  • -qq rend watchfiles exécuter complètement silencieusement
  • -h affiche l'aide et l'utilisation

https://Gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55

1
thiagoh

J'ai fini par le faire pour macOS. Je suis sûr que c'est terrible à bien des égards:

#!/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
0
Dan Rosenstark