Представьте себе дерево каталогов (в Linux):
user@computer:~/demo> find .
.
./test1
./test1/test1_a
./test1/test1_a/somefile_1a
./test1/test1_b
./test1/test1_b/somefile_1b
./test0
./test0/test0_a
./test0/test0_a/somefile_0a
./test0/test0_b
./test0/test0_b/somefile_0b
Сценарий: я определяю всю доступную метаинформацию о каждом каталоге и файле в этом дереве (mtime, ctime, inode, размер, контрольные суммы содержимого файла...), включая каталог самого высокого уровня, demo
. Я храню эту информацию. Затем некоторые файлы или каталоги изменяются (буквально изменяются, вновь создаются или удаляются). Используя ранее определенную и сохраненную информацию, я теперь хочу выяснить, что изменилось.
Мое решение на данный момент: я просматриваю все дерево, затем ищу измененную метаинформацию, а затем обрабатываю ее. Выше определенного размера обход дерева и просмотр каждого каталога и файла становится довольно трудоемким - даже если вы смотрите только на чистую метаинформацию (т.е. ctime, mtime и т. д., а НЕ контрольные суммы содержимого файла). Такой обход можно оптимизировать только до определенной степени (например, читать метаинформацию о файлах и папках фактически только один раз во время обхода, а не несколько раз и т. д.) — в конце дня скорость ввода-вывода становится узким местом.
Вопрос: Какие варианты у меня есть (в файловых системах Unix/Linux) для поиска изменений в моем дереве без обхода всего дерева? Т.е. есть ли какая-либо информация, хранящаяся для demo
, которая говорит мне / указывает каким-то образом, что что-то под ним (например, somefile_1b
) было изменено? Существуют ли какие-либо определенные файловые системы (EXT*, XFS, ZFS, ...), предлагающие такие функции?
Примечание. мне известен вариант запуска фоновый процесс для мониторинга изменений в файловой системе. Это устранило бы необходимость полного обхода моего дерева, хотя меня больше интересуют варианты, которые НЕ требуют процесса фонового мониторинга (если такая опция существует вообще).