Comment effectuer une tâche lorsqu’un nouveau fichier est ajouté à un répertoire sous Linux

Ce tutoriel vous montrera comment utiliser les événements du système de fichiers Linux (notifier) ​​pour être notifié à chaque fois qu’un fichier apparaît dans un répertoire. Vous pouvez les utiliser comme déclencheurs pour automatiser les tâches courantes sur votre système.

Nous allons écrire un script qui surveille un répertoire et agit sur les nouveaux fichiers ajoutés. Chaque fichier est gzippé et déplacé vers un autre répertoire, dès qu’il est détecté. Le script utilise le sous-système inotify, via un utilitaire appelé inotify-tools. Mais d’abord, installons l’outil et expérimentons.

Installer inotify-tools et gzip

Utilisez apt-get pour installer ce paquet sur votre système si vous utilisez Ubuntu ou une autre distribution basée sur Debian. Sur les autres distributions Linux, utilisez plutôt l’outil de gestion des packages de votre distribution Linux.

sudo apt-get install inotify-tools gzip

Expérimenter avec les outils inotify

Commençons par regarder un répertoire et voir quels événements se déclenchent lorsque de nouveaux fichiers arrivent. Nous utiliserons un outil appelé inotifywatch, qui fait partie de inotify-tools. Créez un nouveau répertoire appelé «entrant»:

mkdir incoming

Commencez à regarder ce répertoire en exécutant la commande suivante:

inotifywatch -v incoming

Cela demandera à inotify de surveiller tous les événements du système de fichiers dans le répertoire «entrant». L’option -v permet à l’outil d’afficher des informations supplémentaires sur ce qu’il fait. Nous n’avons pas spécifié d’option de délai d’expiration (-t), et la commande continuera à collecter les événements jusqu’à ce que nous quittions avec CTRL + C. À ce stade, notre terminal devrait ressembler à ceci:

  5 jeux PC rétro effrayants pour jouer à Halloween

Ouvrez une nouvelle fenêtre (ou onglet) de terminal et passez au répertoire entrant. Utilisez la commande tactile pour créer un nouveau fichier nommé «nouveau fichier».

cd incoming/
touch newfile

Revenez maintenant à la première fenêtre du terminal et arrêtez inotifywatch en appuyant sur CTRL + C.

Un tableau des événements sera diffusé sur la console, indiquant une instance de «create», «open», «attrib» et «close_write». Ces quatre événements se sont produits lorsque nous avons utilisé touch pour créer un nouveau fichier, défini ses attributs d’accès au fichier, l’avons ouvert pour écrire un caractère de fin nul, puis l’avons fermé par la suite. Ce ne sont là que quelques-uns de la multitude d’événements qui peuvent être surveillés sur un système de fichiers avec inotify-tools. Vous pouvez voir la liste complète sur la page principale d’inotifywatch.

Pour nos besoins, nous ne sommes intéressés que par deux événements:

«Créer» – lorsqu’un fichier est créé dans le répertoire cible.
«Déplacé vers» – lorsqu’un fichier est déplacé d’un autre emplacement vers le répertoire cible.

Essayons à nouveau inotifywatch, mais cette fois en lui demandant de surveiller ces deux événements uniquement. Exécutez cette commande dans la première fenêtre du terminal:

inotifywatch -v -e create -e moved_to incoming

Dans la deuxième fenêtre ou onglet du terminal, essayons de créer un nouveau fichier, de modifier son contenu, puis de déplacer le fichier d’un autre emplacement vers le répertoire cible. Toutes ces commandes sont exécutées à partir du répertoire personnel.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Revenez à la première fenêtre du terminal et arrêtez inotifywatch en appuyant sur CTRL + C. Nous verrons la sortie suivante:

  Comment renommer des fichiers en nom de dossier parent sous Windows 10

Seuls deux événements ont été comptés: la création d’un fichier appelé «created.txt» et le déplacement d’un fichier existant appelé «created2.txt». Tout le reste, comme la modification de «created.txt», a été ignoré.

Regarder un répertoire et exécuter une tâche

Maintenant que nous savons quels événements suivre, nous pouvons utiliser un autre outil appelé inotifywait pour bloquer l’exécution jusqu’à ce qu’un fichier soit créé ou déplacé vers notre répertoire cible. Nous utiliserons les mêmes arguments que nous l’avons fait avec inotifywatch et spécifierons également comment nous voulons que le nom de fichier soit formaté pour être utilisé dans notre tâche.

Avant de commencer, nous avons besoin d’un répertoire pour contenir les fichiers qui ont déjà été traités. Créez un répertoire appelé «traité»:

mkdir processed

Ensuite, créez un nouveau script appelé «watch-incoming.sh» et ajoutez le contenu répertorié ci-dessous:

#!/bin/bash

TARGET=~/incoming/
PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET 
        | while read FILENAME
                do
                        echo Detected $FILENAME, moving and zipping
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

Le script exécute la commande inotifywait avec l’option -m. Cela rend le moniteur de commande change indéfiniment. Chaque fois qu’un nouvel événement est détecté, le nom de fichier est passé à la commande de lecture et injecté dans la variable «FILENAME». Le bloc sous la boucle while est exécuté, dans lequel le fichier est d’abord déplacé vers le répertoire «traité» puis gzippé. Le fichier d’origine est remplacé par le fichier compressé et le nom de fichier se terminera par «.gz».

  Suivez les aliments que vous avez brûlés avec votre niveau d'activité quotidien

Accordons des autorisations d’exécution sur ce script et exécutons-le depuis notre répertoire personnel.

chmod u+x watch-incoming.sh
./watch-incoming.sh

Ouvrez la deuxième fenêtre du terminal et créez un nouveau fichier dans le répertoire «entrant». Répertoriez le contenu du répertoire «entrant» et «traité» pour voir les résultats de l’événement détecté:

Le fichier texte brut que nous avons copié dans le répertoire «entrant» a été détecté par le script, copié dans «traité» puis compressé à l’aide de gzip.

Nous pouvons faire des tâches intéressantes maintenant que nous sommes en mesure de surveiller l’arrivée de nouveaux fichiers dans un répertoire. Par exemple, nous pourrions ajouter un filigrane aux fichiers image, compresser des vidéos brutes au format mp4 et même télécharger chaque nouveau fichier que nous voyons dans un compartiment Amazon S3. Ce script est un bon point de départ pour lancer vos propres flux de travail et automatiser les tâches courantes sur votre système.