Це пов’язано з способом, який ви використовуєте 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та підкаталогів (тобто ви побачите, до яких файлів було доступно / переміщено / тощо, але воно не скаже вам їх назви).