O seguinte funciona para mim:
Exemplo
Abaixo, mostra um exemplo de inotifywait
usando um método semelhante ao seu.
$ inotifywait -r -e close_write "somedir" | while read f; do echo "$f hi";done
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
Eu entro no diretório somedir
e toque em afile, touch afile
. O que resulta disso na janela inotifywait
:
somedir/ CLOSE_WRITE,CLOSE afile hi
OBSERVAÇÃO: Para obter todos os resultados de inotifywait
, você pode modificar um pouco seu exemplo:
$ inotifywait -r -e close_write "somedir" 2>&1 | \
while read f; do echo "$f | hi";done
Setting up watches. Beware: since -r was given, this may take a while! | hi
Watches established. | hi
E, novamente, toque em um arquivo com o comando touch afile
. Agora vejo o evento:
somedir/ CLOSE_WRITE,CLOSE afile | hi
Para outro exemplo que mostra como usar inotifywait
, dê uma olhada no exemplo que mostrei em minha resposta a este P & A intitulado: Detecta automaticamente quando um arquivo atinge um limite de tamanho .
Seu problema
Acredito que parte do seu problema é que você está assumindo que a saída retornada de inotifywait
é apenas o nome do arquivo, embora claramente não seja dos exemplos acima.
Portanto, essas declarações if
nunca serão bem-sucedidas:
if [[ -d "${f}" ]]; then
and
if [[ -f "${f}" ]]; then
Ao desenvolver scripts Bash como esse, geralmente é útil ativar as mensagens de depuração por meio deste comando na parte superior:
set -x
Você pode desativá-lo com isto:
set +x
Você pode agrupar seções do seu código usando essas mensagens para ativá-lo / desativá-lo.
set -x
...code...
set +x