entr est l'outil de notification de fichiers le plus simple et le plus composable que j'ai vu. Son utilisation est optimisée pour regarder des fichiers plutôt que des répertoires, mais elle peut également résoudre votre cas.
Pour détecter et agir sur le fichier ajouté, combinez-le avec d'autres outils comme par exemple make
. entr
n'envoie pas le nom ou quelque chose comme ça, il exécute simplement ce que vous lui avez dit d'exécuter.
Pour vérifier les fichiers ajoutés dans un répertoire:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
Si vous souhaitez également agir lorsqu'un fichier existant change:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... et c'est là que le mécanisme de boucle est utile, car l' find
expression s'exécutera à nouveau si un fichier est ajouté.
Si vous voulez une meilleure gestion des erreurs et que vous voulez vous assurer que les choses ne s'exécutent qu'une fois par fichier ajouté / supprimé, les choses deviennent un peu bizarres, mais pour ces cas simples, c'est génial.
EDIT: Si vous voulez faire cela au niveau du système, quelque chose comme incron , ajoutez simplement le script à votre gestionnaire de processus préféré (comme s6 , runit , systemd ou sysvinit et sautez la boucle:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
Le exec
et la substitution de processus ( <(...)
) sont importants lors de l'exécution à partir d'un gestionnaire de processus, pour gérer correctement la signalisation (c'est-à-dire pour éloigner le shell).