Điều này là do cách bạn đang sử dụng inotifywatchvà cách thức hoạt động của công cụ. Khi bạn chạy inotifywatch -r /tmp, bạn bắt đầu xem /tmpvà tất cả các tệp đã có trong đó. Khi bạn tạo một tệp bên trong /tmp, siêu dữ liệu thư mục được cập nhật để chứa số inode của tệp mới, điều đó có nghĩa là thay đổi xảy ra /tmpchứ không phải /tmp/test-1. Ngoài ra, vì /tmp/test-1không có ở đó khi inotifywatchbắt đầu, không có inotifychiếc đồng hồ nào được đặt trên đó. Điều đó có nghĩa là bất kỳ sự kiện nào xảy ra trên một tệp được tạo sau khi đồng hồ đã được đặt sẽ không được phát hiện . Bạn có thể hiểu nó tốt hơn nếu bạn nhìn thấy nó:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Nếu bạn đã bật cơ chế theo dõi trêninotify_add_watch(2) , lệnh cuối cùng sẽ cung cấp cho bạn số lượng đồng hồ được thiết lập theo inotifywatch. Con số này phải giống với con số do inotifywatchchính nó đưa ra . Bây giờ, tạo một tập tin bên trong /tmpvà kiểm tra lại:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Số lượng sẽ không tăng, có nghĩa là tệp mới không được xem. Lưu ý rằng hành vi là khác nhau nếu bạn tạo một thư mục thay thế:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Điều này là do cách -rhành xử của công tắc :
-r, --recursive: [...] Nếu các thư mục mới được tạo trong các thư mục đã xem, chúng sẽ tự động được xem.
Chỉnh sửa: Tôi có một chút nhầm lẫn giữa hai ví dụ của bạn, nhưng trong trường hợp đầu tiên , những chiếc đồng hồ được đặt một cách chính xác bởi vì các cuộc gọi sử dụng inotifywatchtrên ~/*(mà được mở rộng, thấy comment don_crissti ở đây ). Các thư mục nhà cũng được xem bởi vì ~/.*có chứa ~/.. Về mặt lý thuyết, nó cũng nên chứa ~/.., kết hợp với công -rtắc, sẽ dẫn đến việc xem toàn bộ hệ thống.
Tuy nhiên, nó là tốt để có được tên của tập tin kích hoạt một tạo sự kiện trong một thư mục theo dõi, nhưng tôi đoán inotifywatchkhông lấy thông tin này (nó được lưu sâu hơn một chút so với tên thư mục). inotify-toolscung cấp một công cụ khác, được gọi inotifywait, có thể hoạt động khá giống inotify-watchvà cung cấp nhiều tùy chọn đầu ra hơn (bao gồm %f, đó là những gì bạn đang tìm kiếm ở đây):
inotifywait -m --format "%e %f" /tmp
Từ trang người đàn ông :
--format <fmt>Xuất ra ở định dạng do người dùng chỉ định, sử dụng cú pháp giống như printf. [...] Các chuyển đổi sau được hỗ trợ:
%f: khi một sự kiện xảy ra trong một thư mục, điều này sẽ được thay thế bằng tên của tệp gây ra sự kiện đó .
%e: được thay thế bằng (các) Sự kiện đã xảy ra, được phân tách bằng dấu phẩy.
Ngoài ra, -mtùy chọn (màn hình) sẽ tiếp tục inotifywaitchạy sau sự kiện đầu tiên, sẽ tái tạo một hành vi khá giống với inotifywatch's.
.bashrctrong ví dụ @serverfaultkhông xuất hiện trong các số liệu thống kê vì người dùng theo dõi đệ quy thư mục chính của nó nhưng vìpath/.*được mở rộng và kết quả là đồng hồ được đặt cho tất cả .files bên dướipath/(.bashrcbao gồm). Lệnh được OP sử dụng sẽ không bao giờ xuất tên tệp vì đồng hồ được đặt cho/tmpvà mọi thư mục con do đó thống kê sẽ chỉ liên quan đến/tmpvà các thư mục con của nó (tức là bạn sẽ thấy các tệp đã được truy cập / di chuyển / vv nhưng nó sẽ không cho bạn biết tên).