He visto esta respuesta .
Debería considerar usar inotifywait, como ejemplo:
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
Mi pregunta es que, el script anterior observa un directorio para la creación de archivos de cualquier tipo, pero ¿cómo modifico el inotifywait
comando para informar solo cuando se crea un archivo de cierto tipo / extensión (o se mueve al directorio)? informar cuando .xml
se crea cualquier archivo.
Lo que intenté:
Ejecuté el inotifywait --help
comando y leí las opciones de la línea de comando. Tiene --exclude <pattern>
y --excludei <pattern>
comandos para EXCLUIR archivos de ciertos tipos (mediante el uso de regEx), pero necesito una forma de INCLUIR solo los archivos de cierto tipo / extensión.
path
arriba probablemente no sea el mejor nombre de variable si quieres jugar con esto primero en un shell. Si lo usa, no podrá usar comandos y todo, ya que esto básicamente ha anulado el estándarPATH
. Por lo tanto, recomiendo usar un nombre var alternativo, como en sufpath
lugar. es decirwhile read fpath action file
, cualquier comando estándar generalmente disponible desde su shell seguirá siéndolo.Respuestas:
Tenga en cuenta que este es un código no probado ya que no tengo acceso en
inotify
este momento. Pero algo similar a esto debería funcionar:fuente
incron
(espero que no).inotify
, ya sea connohup
o empezar con el servicio systemd una costumbre. Muy a menudo este último.Use un doble negativo:
Esto solo incluirá archivos javascript
fuente
inotifywait
que genere una gran salida para todos los archivos y luego los filtre (como en la otra respuesta). No lo he intentado, pero supongo que funcionaría un poco más rápido.--exclude
entrada para ver los.ext
archivos. ¿Esto se ejecuta solo una vez o en un bucle 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
Estoy seguro de que la expresión regular se puede optimizar, pero este bebé funciona :)Mientras que el enfoque doble negativo de la respuesta anterior es una buena idea, ya que (como señaló TMG) realmente cambia el trabajo de filtrado
inotifywait
, no es correcto.Por ejemplo, si un archivo termina
as
, no coincidirá[^j][^s]$
porque la letra finals
no coincide[^s]
, por lo tanto, no se excluirá.En términos booleanos, si
S
es la declaración:y
J
es la declaración:entonces el valor del
--exclude
parámetro debería igualar semánticamente a lonot(J and S)
que, según las leyes de De Morgan, esnot(J) or not(S)
.Otro problema potencial es que
zsh
, en ,$path
es una variable incorporada que representa el equivalente de la matriz$PATH
, por lo que lawhile read path ...
línea se desordenará completamente$PATH
y hará que todo se vuelva ejecutable desde el shell.Por lo tanto, el enfoque correcto es:
Tenga en cuenta lo
.
que se necesita después[^j]
para asegurarse de que la coincidencia se aplique en la penúltima posición, y también que el|
carácter (que representa el OR booleano mencionado anteriormente) no se debe escapar aquí porque--exclude
toma expresiones regulares extendidas POSIX.fuente