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

Ce didacticiel 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

Utilisation 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». le -v L’option permet à l’outil d’imprimer 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 des événements jusqu’à ce que nous quittions avec CTRL + C. À ce stade, notre terminal devrait ressembler à ceci:

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é «newfile».

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éfinir ses attributs d’accès au fichier, l’ouvrir pour écrire un caractère de fin nul, puis le fermer par la suite. Ce ne sont là que quelques-uns des nombreux é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.
  • «Move_to» – lorsqu’un fichier est déplacé d’un autre emplacement vers le répertoire cible.
En relation :  Non, vous n'avez pas besoin de désinstaller VLC

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:

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 le inotifywait commande avec la -m option. 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».

Accordons des autorisations d’exécution sur ce script et exécutons-le à partir de 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 des répertoires «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.

En relation :  Armure Ghost of Tsushima Iki Island: Comment obtenir l'armure Sarugami

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.

Moyens Staff
Moyens I/O Staff vous a motivé, donner des conseils sur la technologie, le développement personnel, le style de vie et des stratégies qui vous aider.