Comment exécuter la commande lorsque le fichier change sous Linux ?



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.