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?
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.
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 commandexargs
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
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
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 .
fswatch
version 1.xUsage:
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.
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.
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.
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).
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.
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.
-l, --latency
.-n, --numeric
.strftime
avec -t, --time-format
.-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
.
Apple OSX Actions sur les dossiers vous permet d'automatiser les tâches en fonction des actions effectuées sur un dossier.
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.
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'utilisationhttps://Gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
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