Как определить, были ли файлы изменены в дереве каталогов без обхода всего дерева?
Представьте себе дерево каталогов (в 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, size, контрольные суммы содержимого файла...), включая каталог самого высокого уровня, demo
, Я храню эту информацию. Затем некоторые файлы / каталоги или каталоги / изменяются (буквально изменяются или создаются заново или удаляются). Используя ранее определенную и сохраненную информацию, я хочу выяснить, что изменилось.
Мое решение до сих пор: я просматриваю все дерево, затем ищу измененную метаинформацию и обрабатываю ее. При превышении определенного размера обход дерева и просмотр каждого каталога и файла отнимает много времени - даже если вы смотрите только на чистую метаинформацию (например, ctime, mtime и т. Д., А НЕ контрольные суммы содержимого файла). Можно оптимизировать такой обход только до определенной степени (например, считывать метаинформацию о файлах и папках фактически только один раз во время обхода, а не несколько раз и т. Д.) - в конце дня скорость ввода-вывода становится узким местом.
Вопрос: Какие варианты у меня есть (в файловых системах Unix / Linux), чтобы искать изменения в моем дереве, не обходя все это? Т.е. хранится ли какая-либо информация для demo
который говорит мне / указывает каким-то образом, что что-то под ним (например, somefile_1b
) был изменен? Существуют ли какие-либо конкретные файловые системы (EXT*, XFS, ZFS, ...), предлагающие такие функции?
Примечание. Мне известно о возможности запуска фонового процесса для отслеживания изменений в файловой системе. Это исключило бы необходимость полного обхода моего дерева, хотя меня больше интересуют варианты, которые НЕ требуют фонового мониторинга (если такая опция вообще существует).
1 ответ
ZFS предоставляет возможность через zfs diff ...
Согласно документации Oracle Solaris 11.2:
Выявление различий в снимках ZFS (zfs diff)
Вы можете определить различия снимков ZFS, используя
zfs diff
команда.Например, предположим, что созданы следующие два снимка:
$ ls /tank/home/tim fileA $ zfs snapshot tank/home/tim@snap1 $ ls /tank/home/tim fileA fileB $ zfs snapshot tank/home/tim@snap2
Например, чтобы определить различия между двумя снимками, используйте синтаксис, подобный следующему:
$ zfs diff tank/home/tim@snap1 tank/home/tim@snap2 M /tank/home/tim/ + /tank/home/tim/fileB
В выводе M указывает, что каталог был изменен. Знак + указывает, что файл B существует в более позднем снимке.
Символ R в следующем выводе указывает, что файл в снимке был переименован.
$ mv /tank/cindy/fileB /tank/cindy/fileC $ zfs snapshot tank/cindy@snap2 $ zfs diff tank/cindy@snap1 tank/cindy@snap2 M /tank/cindy/ R /tank/cindy/fileB -> /tank/cindy/fileC
Это сравнивает только два снимка, поэтому вам нужно иметь возможность создавать снимки ZFS, чтобы эффективно их использовать.