Це пов’язано з способом, який ви використовуєте inotifywatch
, і з тим, як працює сам інструмент. Запустивши inotifywatch -r /tmp
, ви починаєте дивитися /tmp
та всі файли, які вже є в ньому. Коли ви створюєте файл всередині /tmp
, метадані каталогів оновлюються, щоб вони містили номер inode нового файлу, що означає, що зміна відбувається /tmp
, а не /tmp/test-1
. Крім того, оскільки /tmp/test-1
його не було при inotifywatch
запуску, на ньому немає inotify
годинника. Це означає, що будь-яка подія, яка відбудеться у файлі, створеному після розміщення годинника, не буде виявлена . Ви можете це краще зрозуміти, якщо побачите самі:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Якщо ви ввімкнули механізм відстеженняinotify_add_watch(2)
, остання команда дасть вам кількість годин, встановлених inotifywatch
. Це число повинно бути таким же, як і дане inotifywatch
само собою. Тепер створіть файл усередині /tmp
і перевірте ще раз:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Кількість не збільшиться, а це означає, що новий файл не буде переглянуто. Зауважте, що поведінка відрізняється, якщо ви створюєте каталог замість цього:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Це пов’язано з тим, як -r
поводиться перемикач :
-r
, --recursive
: [...] Якщо нові каталоги будуть створені в каталогів, що спостерігаються, вони автоматично переглядаються.
Edit: я трохи заплутався між вашими двома прикладами, але в першому випадку , годинник правильно розміщені , так як виклики користувача inotifywatch
на ~/*
(який розкладається, см коментар don_crissti тут ). Домашній каталог також переглядається, оскільки ~/.*
містить ~/.
. Теоретично він також повинен містити ~/..
, що в поєднанні з -r
комутатором має спричинити перегляд всієї системи.
Тим НЕ менше, це можливо , щоб отримати ім'я файлу , що запускає створити подію в спостережуваному каталозі, але я припускаю , inotifywatch
не одержати цю інформацію (він зберігається трохи глибше , ніж ім'я каталогу). inotify-tools
надає ще один інструмент, який називається inotifywait
, який може вести себе подібним чином inotify-watch
, і надає більше варіантів виводу (в тому числі %f
, саме те, що ви шукаєте тут):
inotifywait -m --format "%e %f" /tmp
Від людини сторінці :
--format <fmt>
Виведіть у визначеному користувачем форматі, використовуючи синтаксис, схожий на printf. [...] Підтримуються такі конверсії:
%f
: коли подія відбувається в каталозі, це буде замінено на ім'я файлу, який спричинив подію .
%e
: замінено на події, що відбулися, розділені комами.
Крім того, -m
опція (монітор) буде продовжувати inotifywait
працювати після першої події, що відтворить поведінку, досить схожу на inotifywatch
's.
.bashrc
у прикладі @serverfault
не відображається у статистиці, оскільки користувач ревізує домашній каталог рекурсивно, а тому, щоpath/.*
він розширений, і в результаті встановлюється перегляд усіх файлів у.path/
(.bashrc
включено). Команда, що використовується ОП, ніколи не виводить імена файлів, тому що годинник встановлений для/tmp
будь-яких підкаталогів, тому статистика стосуватиметься лише/tmp
та підкаталогів (тобто ви побачите, до яких файлів було доступно / переміщено / тощо, але воно не скаже вам їх назви).