Je veux regarder un dossier sur mon Mac (Snow Leopard) puis exécuter un script (en lui donnant le nom de fichier de ce qui vient d'être déplacé dans un dossier (comme paramètre ... x.sh "nom de fichier")).
J'ai un script tout écrit en bash (x.sh) qui déplacera certains fichiers et autres choses en 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?
fswatch
utilité présentée comme réponse ci-dessous utilise en fait cette méthode.Réponses:
fswatch
fswatch est un petit programme utilisant l'API FSEvents de Mac OS X pour surveiller un répertoire. Lorsqu'un événement concernant une modification de ce répertoire est reçu, la commande shell spécifiée est exécutée par
/bin/bash
Si vous êtes sous GNU / Linux, inotifywatch (qui fait partie du
inotify-tools
package sur la plupart des distributions) fournit des fonctionnalités similaires.Mise à jour:
fswatch
peut désormais être utilisée sur de nombreuses plates-formes, notamment BSD, Debian et Windows.Syntaxe / Un exemple simple
La nouvelle façon de regarder plusieurs chemins - pour les versions 1.x et supérieures :
L'ancienne méthode pour les versions 0.x :
Installation avec Homebrew
Le 9/12/13, il a été ajouté à homebrew - yay! Donc, mettez à jour votre liste de formules (
brew update
) et tout ce que vous avez à faire est de:Installation sans Homebrew
Tapez ces commandes dans
Terminal.app
Si vous n'avez pas de
c
compilateur sur votre système, vous devrez peut-être installer les outils de ligne de commande Xcode ou Xcode - tous deux gratuits. Cependant, si tel est le cas, vous devriez probablement vérifier les homebrews .Options supplémentaires pour la
fswatch
version 1.xla source
make
renvoie une erreur de ne pas trouver un makefile. Heureusement, fswatch est maintenant sur MacPorts, donc çasudo port install fswatch
marche, pour ceux d'entre nous qui utilisent MacPorts au lieu de Homebrew.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
surveillerez simplement le répertoire actuel.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
avec-0
pour NULLs. Celui-ci fonctionne pour moi pour moins de compilationVous pouvez utiliser launchd à cet effet. Launchd peut être configuré pour lancer automatiquement un programme lorsqu'un chemin de fichier est modifié.
Par exemple, le plist de configuration de launchd suivant lancera le programme
/usr/bin/logger
lorsque le dossier du bureau de mon compte d'utilisateur est modifié:Pour activer le plist de configuration, enregistrez-le dans le dossier LaunchAgents de votre dossier Library sous le nom "logger.plist".
Depuis le shell, vous pouvez ensuite utiliser la commande
launchctl
pour activer le logger.plist en exécutant:Le dossier du bureau est maintenant surveillé. Chaque fois qu'il est modifié, vous devriez voir une sortie dans le system.log (utilisez Console.app). Pour désactiver le logger.plist, exécutez:
Le fichier de configuration ci-dessus utilise l'
WatchPaths
option. Alternativement, vous pouvez également utiliser l'QueueDirectories
option. Consultez la page de manuel launchd pour plus d'informations.la source
/usr/bin/logger
de script Bash et supprimé l'"<string>path modified</strong>"
entrée, je n'ai trouvé aucun moyen pour mon script bash de savoir quel fichier sur mon bureau a été modifié - juste que l'événement s'est produit. J'ai essayé de regarder$0
,$1
et je n'ai obtenu que le nom du script lui-même, en notant qu'il lui avait été transmis.Le gardien de Facebook , disponible via Homebrew, a également l'air sympa. Il prend également en charge le filtrage:
Notez que le chemin doit être absolu.
la source
Vous voudrez peut-être jeter un œil à (et peut-être étendre) mon petit outil
kqwait
. Actuellement, il reste assis et attend un événement d'écriture sur un seul fichier, mais l' architecture kqueue permet un empilement d'événements hiérarchique ...la source
fswatch
(ce qui est bien aussi, car c'est un emballage si léger qu'il pourrait également être modifié pour faire la bonne chose, je suis sûr) où il se déclencherait lors de l'exécution de choses commegit status
(qui est en fait exécuté à chaque fois que zsh l'invite est rendue sur ma machine ...) qui en fait un peu foiré ce script élaboré que j'ai en créant une boucle de rétroaction sans fin. kqwait, cependant, fournit les informations sur le fichier modifié et n'est pas déclenché pargit status
. Mais j'en ai besoin pour tirer en écriture.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog est une API python multiplateforme pour regarder les fichiers / répertoires, et il dispose d'un outil "astuces" intégré qui vous permet de déclencher des actions (y compris les commandes shell) lorsque des événements se produisent (y compris un nouveau fichier ajouté, un fichier supprimé et un fichier modifié).
la source
C'est juste pour mentionner entr comme alternative sur OSX pour exécuter des commandes arbitraires lorsque les fichiers changent. Je le trouve simple et utile.
la source
Voici un one-liner utilisant
sschober
l' outil de .la source
$ brew install kqwait
Modifier:
fsw
a été fusionnéfswatch
. Dans cette réponse, toute référence àfsw
devrait maintenant être luefswatch
.J'ai écrit un
fswatch
remplacement en C ++ appeléfsw
qui présente plusieurs améliorations:C'est un projet GNU Build System qui s'appuie sur n'importe quelle plate-forme prise en charge (OS X v.> = 10.6) avec
Plusieurs chemins peuvent être passés sous différents arguments:
Il sauvegarde un enregistrement détaillé avec toutes les informations sur l'événement, telles que:
Sa sortie est facile à analyser afin que la
fsw
sortie puisse être dirigée vers un autre processus.-l, --latency
.-n, --numeric
.strftime
chaînes de format 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:Installation de fsw:
fsw
peut être installé à l'aide des commandes suivantes:Plus d'informations:
J'ai également écrit un billet de blog d' introduction où vous pouvez trouver quelques exemples sur le
fsw
fonctionnement.la source
Les actions du dossier Apple OSX vous permettent d'automatiser les tâches en fonction des actions prises sur un dossier.
la source
Ma fourchette de fswatch fournit la fonctionnalité
inotifywait -m
avec un peu moins (pas d'attente, plus! J'ai beaucoup plus de problèmes sur Linux avecinotifywait
...) une sortie conviviale pour l'analyse.C'est une amélioration par rapport à l'original
fswatch
car il envoie le chemin réel du fichier modifié sur STDOUT plutôt que de vous obliger à fournir un programme qu'il bifurque.Cela a été solide comme fondement d'une série de scripts bash effrayants que j'utilise pour automatiser des trucs.
(ceci est hors sujet)
inotifywait
sous Linux, d'autre part, nécessite beaucoup de compliments et je n'ai toujours pas trouvé un bon moyen de le gérer, bien que je pense que quelque chose basé surnode.js
pourrait être le ticket.la source
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
J'ai un GIST pour cela et l'utilisation est assez simple
Pour illustrer, la commande suivante fera écho à
Hello World
chaque fois quefile1
OUfile2
changera; et la vérification de l'intervalle par défaut est de 1 secondeSi je veux vérifier toutes les 5 secondes, je peux utiliser le
-t
drapeau-v
active leverbose
mode qui affiche les informations de débogage-q
faitwatchfiles
exécuter tranquillement (#
sera affiché pour que l'utilisateur puisse voir que le programme s'exécute)-qq
faitwatchfiles
exécuter complètement silencieusement-h
montre l'aide et l'utilisationhttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
la source
J'ai fini par le faire pour macOS. Je suis sûr que c'est terrible à bien des égards:
la source
Si vous souhaitez utiliser NodeJS, vous pouvez utiliser un package appelé chokidar (ou chokidar-cli en fait) pour l'observation, puis utiliser
rsync
(inclus avec Mac):Commande Rsync:
$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'
Chokidar cli (installé globalement via npm):
chokidar \"**/*\" -c \"your-rsync-command-above\"
la source
Voici une alternative simple sur une seule ligne pour les utilisateurs qui n'ont pas la
watch
commande et qui souhaitent exécuter une commande toutes les 3 secondes:while :; do your-command; sleep 3; done
C'est une boucle infinie qui est fondamentalement la même que celle qui suit:
watch -n3 your-command
la source
your-command
E / S de disque sont effectuées, il s'agit d'une lecture / écriture de disque garantie toutes les 3 secondes - ou 10 800 fois par heure. En utilisant des événements de système de fichiers, vous auriez la garantie que les E / S (et autres opérations coûteuses) ne se produisent que lorsque vous modifiez un fichier (ce qui n'est généralement que quelques fois par heure).watch
choses pendant des périodes temporaires pour voir ce que quelque chose fait. Je n'utilise pas ma technique mentionnée pour les applications de production ou quelque chose comme ça. Par exemple, j'aimerais voir la progression dedd
, et ma technique y arrive (en remplaçantyour-command
le cas échéant pour envoyer le signal appropriédd
).