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.
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
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
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.
--include et --includei sont des options réelles dans la version principale des binaires au moins: