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