O
entr é a ferramenta de notificação de arquivos mais simples e mais composta que já vi. Seu uso é otimizado para assistir a arquivos em vez de diretórios, mas também pode resolver seu caso.
Para detectar e atuar no arquivo adicionado, combine-o com outras ferramentas, como, por exemplo, %código%. make
não envia o nome ou algo assim, ele simplesmente executa o que você disse para executar.
Para verificar se há arquivos adicionados em um diretório:
## 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
Se você quiser também agir quando um arquivo existente for alterado:
## 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
... e é aí que o mecanismo de loop é útil, pois a expressão entr
será executada novamente se um arquivo for adicionado.
Se você quiser um melhor tratamento de erros e quiser ter certeza de que as coisas só serão executadas uma vez por arquivo adicionado / removido, as coisas ficam um pouco estranhas, mas para esses casos simples é brilhante.
EDIT: Se você quiser fazer isso em um nível de sistema, algo como incron , basta adicionar o script ao seu gerenciador de processos favorito (como s6 , runit , systemd ou sysvinit e pule o loop:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
O find
e a substituição do processo ( exec
) são importantes quando executados a partir de um gerenciador de processos, para manipular a sinalização corretamente (ou seja, para tirar o shell do caminho).