Как определить, были ли файлы изменены в дереве каталогов без обхода всего дерева?

Представьте себе дерево каталогов (в 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, чтобы эффективно их использовать.

Другие вопросы по тегам