web-dev-qa-db-fra.com

Comment utiliser inotifywait pour surveiller un répertoire pour la création de fichiers d'une extension spécifique

J'ai vu cette réponse .

Vous devriez envisager d'utiliser inotifywait, par exemple:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Ma question est que, le script ci-dessus surveille un répertoire pour la création de fichiers de tout type, mais comment puis-je modifier la commande inotifywait pour signaler uniquement lorsqu'un fichier d'un certain type/extension est créé (ou déplacé dans le répertoire) - par exemple il doit signaler quand tout .xml le fichier est créé.

CE QUE J'AI ESSAYÉ:

J'ai exécuté le inotifywait --help et avoir lu les options de la ligne de commande. Il a --exclude <pattern> et --excludei <pattern> commandes pour EXCLURE fichiers de certains types (en utilisant regEx), mais j'ai besoin d'un moyen pour INCLUER seulement ​​les fichiers de un certain type/extension.

23
Shy

comment puis-je modifier la commande inotifywait pour signaler uniquement lorsqu'un fichier d'un certain type/extension est créé

Veuillez noter qu'il s'agit de code non testé car je n'ai pas accès à inotify pour le moment. Mais quelque chose de semblable devrait fonctionner:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done
21
maulinglawns

Utilisez un double négatif:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

Cela inclura uniquement les fichiers javascript

9
tofsjonas

Bien que l'approche à double négatif de la réponse précédente soit une bonne idée car (comme l'a noté TMG), elle déplace en effet le travail de filtrage vers inotifywait, elle n'est pas correcte.

Par exemple, si un fichier se termine par as, il ne correspondra pas à [^j][^s]$ Car la dernière lettre s ne correspond pas à [^s], Il ne sera donc pas exclu.

En termes booléens, si S est l'instruction:

"la dernière lettre est s"

et J est la déclaration:

"l'avant-dernière lettre est j"

alors la valeur du paramètre --exclude doit sémantiquement correspondre à not(J and S), qui par lois de Morgan est not(J) or not(S).

Un autre problème potentiel est que dans zsh, $path Est une variable intégrée représentant l'équivalent tableau de $PATH, Donc la ligne while read path ... Gâchera complètement $PATH Et tout devient inexécutable à partir du shell.

Par conséquent, la bonne approche est la suivante:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

Notez le . Qui est nécessaire après [^j] Pour vous assurer que la correspondance est appliquée à l'avant-dernière position, ainsi que le caractère | (Représentant le booléen OR mentionné ci-dessus) ne doit pas être échappé ici car --exclude Prend des expressions régulières étendues POSIX.

6
Adam Spiers

--include et --includei sont des options réelles dans la version principale des binaires au moins:

https://github.com/rvoicilas/inotify-tools/tree/master

0
ericcurtin