entr es la herramienta de notificación de archivos más simple y composable que he visto. Su uso está optimizado para mirar archivos en lugar de directorios, pero también puede resolver su caso.
Para detectar y actuar sobre el archivo agregado, combínelo con otras herramientas como por ejemplo make
. entr
no envía el nombre ni nada de eso, simplemente ejecuta lo que le dijiste que ejecutara.
Para buscar archivos agregados en un directorio:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
Si también desea actuar cuando cambia un archivo existente:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... y ahí es donde el mecanismo de bucle es útil, ya que la find
expresión se ejecutará nuevamente si se agrega un archivo.
Si desea un mejor manejo de errores y quiere asegurarse de que las cosas solo se ejecuten una vez por archivo agregado / eliminado, las cosas se ponen un poco extrañas, pero para estos casos simples es genial.
EDITAR: si desea hacer esto a nivel de sistema, algo como incron , simplemente agregue el script a su administrador de procesos favorito (como s6 , runit , systemd o sysvinit y omita el ciclo:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
La exec
y la sustitución del proceso ( <(...)
) son importantes cuando se ejecuta desde un administrador de procesos, para manejar la señalización correctamente (es decir, para sacar el shell del camino).