Si vous cherchez à automatiser l’exécution de commandes Linux lors de la modification ou de la création de fichiers dans un répertoire, vous êtes au bon endroit.
Traditionnellement, Linux permet la planification de tâches à des moments précis via l’outil cron.
Cependant, comment faire pour que des commandes se lancent automatiquement dès qu’un fichier est modifié ou qu’un nouveau fichier est ajouté à un répertoire spécifique ?
Heureusement, cela est tout à fait réalisable grâce à des outils en ligne de commande conçus pour cela.
Entrons dans le vif du sujet !
watchexec
watchexec est un utilitaire autonome très pratique qui surveille un répertoire et déclenche une commande lors de changements détectés, tels que la mise à jour d’un fichier ou la création d’un nouvel élément.
Caractéristiques
- Il évite les commandes complexes avec xargs.
- Il observe les modifications en temps réel dans le répertoire courant et ses sous-répertoires.
- Il ne dépend pas d’un environnement d’exécution spécifique à un langage.
- Il utilise .gitignore et .ignore pour ignorer les notifications sur certains fichiers.
- Il emploie les groupes de processus pour gérer les programmes forkés.
- Il permet de cibler les fichiers avec des extensions spécifiques.
- Il est compatible avec macOS, Linux et Windows.
- Il offre la possibilité de filtrer les événements en utilisant des motifs glob.
Installation de watchexec
Pour installer watchexec, copiez la commande ci-dessous dans votre terminal et validez :
Linux et macOS
curl -sS https://webinstall.dev/watchexec | bash
Après une installation réussie, le chemin d’installation sera affiché, dans mon cas : /root/.local/bin
┌──(root💀kali)-[~] └─# curl -sS https://webinstall.dev/watchexec | bash Thanks for using webi to install '[email protected]' on 'Linux/x86_64'. Have a problem? Experience a bug? Please let us know: https://github.com/webinstall/webi-installers/issues Lovin' it? Say thanks with a Star on GitHub: https://github.com/webinstall/webi-installers Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec
Vérifiez la présence du fichier dans le répertoire .local/bin avec ces commandes :
cd .local/bin ls
Ensuite, exportez le chemin d’accès pour pouvoir utiliser watchexec :
export PATH="/root/.local/bin:$PATH"
Pour exécuter, tapez simplement ‘watchexec’ dans le terminal en tant que root. Pour afficher les options disponibles, utilisez :
watchexec --help
Exemples de commandes
- Lancer ‘ls -la’ en cas de changement dans le répertoire courant/ses sous-répertoires :
watchexec -- ls -la
- Exécuter une commande lorsqu’un fichier Python, JavaScript, CSS ou HTML est modifié :
watchexec --exts py,js,css,html <command>
- Déclencher une action en cas de modification dans les dossiers ‘lib’ ou ‘src’ :
watchexec -w lib -w src <command>
- Redémarrer un service quand un fichier change (ici, un fichier html et un serveur tor, ou js,py et mysql) :
watchexec -e html -r tor watchexec -e js,py -r mysql
L’option ‘-r’ permet de redémarrer un processus existant.
Pour plus d’exemples, consultez le dépôt GitHub officiel.
entr
entr est un outil simple et efficace pour lancer des commandes lors de changements dans un répertoire spécifié.
Le nom ‘entr’ signifie « Event Notify Test Runner ». Il a été conçu pour faciliter le développement itératif et les tests automatisés.
Installation
entr est généralement inclus dans les distributions Linux. Sinon, il peut être installé manuellement.
Son installation est simple :
sudo apt-get install entr
Il peut également être installé en clonant le dépôt Git :
git clone https://github.com/eradman/entr.git
Puis, en se positionnant dans le répertoire cloné, lancer ces commandes :
./configure make test make install
Pour voir les options de construction : ./configure -h
Exemples de commandes
Pour connaître les options et arguments disponibles, utilisez :
man entr
Cette commande affiche le manuel d’utilisation d’entr.
NAME entr — run arbitrary commands when files change SYNOPSIS entr [-acdnprsz] utility [argument /_ ...] DESCRIPTION A list of files provided on standard input, and the utility is executed using the supplied arguments if any of them change. entr waits for the child process to finish before responding to subsequent file system events. A TTY is also opened before entering the watch loop in order to support interac‐ tive utilities. The arguments are as follows: -a Respond to all events which occur while the utility is running. Without this option, entr consolidates events in order to avoid looping. This option has no effect in conjunction with the -r flag. -c Clear the screen before invoking the utility specified on the command line. Specify twice to erase the scroll back buffer. -d Track the directories of regular files provided as input and exit if a new file is added. This option also enables directories to be specified explicitly. If specified twice, all new entries to a directory are recognized, otherwise files with names beginning with ‘.’ are ig‐ nored. -n Run in non-interactive mode. In this mode entr does not attempt to read from the TTY or change its properties. -p Postpone the first execution of the utility until a file is modified. Manual page entr(1) line 1 (press h for help or q to quit)
- Redémarrer automatiquement un serveur MySQL lors de la modification d’un fichier JavaScript :
ls *.js | entr -r mysql
- Recharger un serveur web ou le stopper s’il se ferme :
$ ls * | entr -rz ./httpd
Pour plus d’informations et d’exemples, consultez le dépôt GitHub officiel.
Conclusion 👩💻
J’espère que cet article vous aura été utile pour automatiser l’exécution de commandes Linux lors de changements de fichiers dans un répertoire.
Vous pourriez également être intéressé par la gestion de la suppression de fichiers et répertoires sous Linux.