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.