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 inotifywait
commande pour signaler uniquement lorsqu'un fichier d'un certain type / extension est créé (ou déplacé dans le répertoire) - par exemple, il devrait signaler lorsqu'un .xml
fichier est créé.
CE QUE J'AI ESSAYÉ:
J'ai exécuté la inotifywait --help
commande et j'ai lu les options de ligne de commande. Il a --exclude <pattern>
et des --excludei <pattern>
commandes pour EXCLURE les fichiers de certains types (en utilisant regEx), mais j'ai besoin d'un moyen pour INCLURE uniquement les fichiers d'un certain type / extension.
path
ci-dessus n'est probablement pas le meilleur nom de variable si vous voulez jouer avec cette première dans un shell. Si vous l'utilisez, vous ne pourrez pas utiliser les commandes et tout, car cela vient de remplacer la normePATH
. Par conséquent, je recommande d'utiliser un autre nom de var, comme à lafpath
place. c'est-à-dire quewhile read fpath action file
toute commande standard habituellement disponible à partir de votre shell le sera toujours.Réponses:
Veuillez noter qu'il s'agit d'un code non testé car je n'y ai pas accès pour
inotify
le moment. Mais quelque chose de semblable devrait fonctionner:la source
incron
(j'espère que non).inotify
avecnohup
ou le démarre avec un service systemd personnalisé. Le plus souvent, ce dernier.Utilisez un double négatif:
Cela inclura uniquement les fichiers javascript
la source
inotifywait
plutôt que de générer une énorme sortie pour tous les fichiers et de filtrer ensuite (comme dans l'autre réponse). Je n'ai pas essayé, mais je suppose que cela fonctionnerait un peu plus vite.--exclude
entrée pour surveiller les.ext
fichiers. Ceci est exécuté une seule fois ou dans une boucle for?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Je suis sûr que l'expression régulière peut être optimisée, mais ce bébé fonctionne :)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 transfère effectivement le travail de filtrage vers
inotifywait
, elle n'est pas correcte.Par exemple, si un fichier se termine,
as
il ne correspondra pas[^j][^s]$
car la lettre finales
ne correspond pas[^s]
, il ne sera donc pas exclu.En termes booléens, if
S
est la déclaration:et
J
est la déclaration:la valeur du
--exclude
paramètre doit correspondre à sémantiquementnot(J and S)
, qui , par les lois de De Morgan estnot(J) or not(S)
.Un autre problème potentiel est que dans
zsh
,$path
est une variable intégrée représentant l'équivalent du tableau de$PATH
, de sorte que lawhile read path ...
ligne sera complètement gâchée$PATH
et que tout deviendra inexécutable à partir du shell.Par conséquent, la bonne approche est la suivante:
Notez ce
.
qui est nécessaire après[^j]
pour s'assurer que la correspondance est appliquée dans l'avant-dernière position, et aussi que le|
caractère (représentant le booléen OU mentionné ci-dessus) ne doit pas être échappé ici car--exclude
prend des expressions régulières étendues POSIX.la source