Isso se deve à maneira como você está usando inotifywatch e à maneira como a própria ferramenta funciona. Quando você executa inotifywatch -r /tmp , começa a assistir /tmp e todos os arquivos já contidos nele. Quando você cria um arquivo dentro de /tmp , os metadados do diretório são atualizados para conter o novo número de inode do arquivo, o que significa que a alteração acontece em /tmp , não /tmp/test-1 . Além disso, como /tmp/test-1 não estava presente quando inotifywatch começou, não há inotify watch nele. Isso significa que qualquer evento que ocorra em um arquivo criado após a colocação dos relógios não será detectado . Você pode entender melhor se você mesmo ver:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Se você tiver ativado o mecanismo de rastreamento em inotify_add_watch(2) , o último comando fornecerá o número de relógios configurados por inotifywatch . Esse número deve ser o mesmo que o dado por inotifywatch em si. Agora, crie um arquivo dentro de /tmp e verifique novamente:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
O número não aumentará, o que significa que o novo arquivo não é assistido. Observe que o comportamento é diferente se você criar um diretório:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Isso se deve à maneira como a opção -r se comporta :
-r,--recursive: [...] If new directories are created within watched directories they will automatically be watched.
Edit: Eu fiquei um pouco confuso entre seus dois exemplos, mas no primeiro caso , os relógios são colocados corretamente porque o usuário chama inotifywatch on ~/* (que é expandido, veja o comentário de don_crissti aqui ). O diretório inicial também é visto porque ~/.* contém ~/. . Teoricamente, ele também deve conter ~/.. , que, combinado com a opção -r , deve resultar na observação de todo o sistema.
No entanto, é possível obter o nome do arquivo que aciona um evento create em um diretório monitorado, mas acredito que inotifywatch não recupere esse informações (é salvo um pouco mais do que o nome do diretório). inotify-tools fornece outra ferramenta, chamada inotifywait , que pode se comportar como inotify-watch e fornece mais opções de saída (incluindo %f , que é o que você está procurando aqui):
inotifywait -m --format "%e %f" /tmp
De a página do manual :
--format <fmt>Output in a user-specified format, using printf-like syntax. [...] The following conversions are supported:
%f: when an event occurs within a directory, this will be replaced with the name of the file which caused the event to occur.
%e: replaced with the Event(s) which occurred, comma-separated.
Além disso, a opção -m (monitor) manterá inotifywait em execução após o primeiro evento, o que reproduzirá um comportamento bastante semelhante ao inotifywatch 's.