Ciò è dovuto al modo in cui stai utilizzando inotifywatch
e al modo in cui funziona lo strumento stesso. Quando corri inotifywatch -r /tmp
, inizi a guardare /tmp
e tutti i file che sono già in esso. Quando si crea un file all'interno /tmp
, i metadati della directory vengono aggiornati per contenere il numero di inode del nuovo file, il che significa che la modifica avviene /tmp
non /tmp/test-1
. Inoltre, poiché /tmp/test-1
non era presente all'avvio inotifywatch
, non è presente alcun inotify
orologio. Significa che qualsiasi evento che si verifica su un file creato dopo il posizionamento degli orologi non verrà rilevato . Potresti capirlo meglio se lo vedi da solo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Se hai attivato il meccanismo di tracciamentoinotify_add_watch(2)
, l'ultimo comando ti darà il numero di orologi impostati da inotifywatch
. Questo numero dovrebbe essere uguale a quello dato da inotifywatch
solo. Ora, crea un file all'interno /tmp
e controlla di nuovo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Il numero non sarà aumentato, il che significa che il nuovo file non viene guardato. Si noti che il comportamento è diverso se si crea invece una directory:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Ciò è dovuto al modo in cui -r
si comporta l' interruttore :
-r
, --recursive
: [...] Se vengono create nuove directory all'interno delle directory controllate , verranno automaticamente guardate.
Edit: ho avuto un po 'confuso tra le due esempi, ma nel primo caso , gli orologi sono posizionati correttamente perché le chiamate degli utenti inotifywatch
su ~/*
(che è espansa, vedere il commento di don_crissti qui ). Anche la home directory viene guardata perché ~/.*
contiene ~/.
. Teoricamente, dovrebbe anche contenere ~/..
, che, combinato con l' -r
interruttore, dovrebbe comportare la visione dell'intero sistema.
Tuttavia, è possibile ottenere il nome del file che attiva un evento di creazione in una directory controllata, ma suppongo inotifywatch
che non recuperi queste informazioni (viene salvato un po 'più in profondità del nome della directory). inotify-tools
fornisce un altro strumento, chiamato inotifywait
, che può comportarsi in modo molto simile inotify-watch
, e offre più opzioni di output (incluso %f
, che è quello che stai cercando qui):
inotifywait -m --format "%e %f" /tmp
Dalla pagina man :
--format <fmt>
Output in un formato specificato dall'utente, usando una sintassi simile a printf. [...] Sono supportate le seguenti conversioni:
%f
: quando si verifica un evento all'interno di una directory, questo verrà sostituito con il nome del file che ha causato l'evento .
%e
: sostituito con gli Eventi che si sono verificati, separati da virgola.
Inoltre, l' -m
opzione (monitor) continuerà a inotifywait
funzionare dopo il primo evento, che riprodurrà un comportamento abbastanza simile a quello di inotifywatch
.
.bashrc
nell'esempio @serverfault
non appare nelle statistiche perché l'utente controlla ricorsivamente la sua directory home ma perchépath/.*
è espanso e di conseguenza viene impostato un orologio per tutti i file. sottopath/
(.bashrc
incluso). Il comando utilizzato dall'OP non produrrà mai nomi di file perché gli orologi sono impostati per/tmp
ed eventuali sottodirectory quindi le statistiche riguarderanno solo/tmp
e le sue sottodirectory (cioè vedrai che i file sono stati raggiunti / spostati / ecc. Ma non ti diranno loro nomi).