Воссоздание каталогов с файлами по хеш-суммам

velkin velkin
Вопрос к коллективному разуму, кто-нибудь видел проприетарщину, шароварку или опенсорс в виде программы, плагина к программе и так далее и тому подобное со следующим функционалом.

1) У приложения есть виртуальный каталог файлов с размерами и хеш-суммами. Программа проходится по диску и воссоздаёт этот каталог в случае нахождения содержимого.
2) Дополнительный пункт, принцип в первом пункте используется для синхронизации файлов между компьютерами.
Pzz
Pzz
01.03.2021 03:03
Здравствуйте, velkin, Вы писали:

V>1) У приложения есть виртуальный каталог файлов с размерами и хеш-суммами. Программа проходится по диску и воссоздаёт этот каталог в случае нахождения содержимого.

V>2) Дополнительный пункт, принцип в первом пункте используется для синхронизации файлов между компьютерами.

Напоминает битторрент, однако.
velkin
velkin
01.03.2021 03:11
Здравствуйте, Pzz, Вы писали:

Pzz>Напоминает битторрент, однако.


Да, но он произвольно не ищет файлы по диску , и насколько я знаю хранит хеш-суммы кусочков, а не файлов. Есть ещё Direct Connect, но я не знаю может ли он искать виртуальные каталоги. То есть вопрос в том, видел ли кто-нибудь рабочее решение под заданные условия.
chaotic-kotik
chaotic-kotik
01.03.2021 03:47
Здравствуйте, velkin, Вы писали:

V>Здравствуйте, Pzz, Вы писали:


Pzz>>Напоминает битторрент, однако.


V>Да, но он произвольно не ищет файлы по диску , и насколько я знаю хранит хеш-суммы кусочков, а не файлов.


там merkle tree, дерево хэшей, на его основе можно сильно эффективнее решить твою задачу, вместо того, чтобы счиатать хэш от всего файла — считаешь хэш от первого блока и если совпадает — продолжаешь сравнивать дальше
velkin
velkin
01.03.2021 04:15
Здравствуйте, chaotic-kotik, Вы писали:

CK>там merkle tree, дерево хэшей, на его основе можно сильно эффективнее решить твою задачу, вместо того, чтобы счиатать хэш от всего файла — считаешь хэш от первого блока и если совпадает — продолжаешь сравнивать дальше


Насколько понимаю в битторренте все данные каталога это один большой блок, то есть выделить какой-то конкретный файл хеш-суммой, если это торрент каталога, а не одного файла не получится. Но мысль, конечно, интересная, если применить это к каждому файлу. С другой стороны здесь всё же преимущество именно в передаче кусочков по сети, а не в поиске, потому что для поиска достаточно одного полного сканирования. Опять же это если всё это делать самому, но интересны готовые решения.
vsb
vsb
01.03.2021 03:12
Здравствуйте, Pzz, Вы писали:

V>>1) У приложения есть виртуальный каталог файлов с размерами и хеш-суммами. Программа проходится по диску и воссоздаёт этот каталог в случае нахождения содержимого.

V>>2) Дополнительный пункт, принцип в первом пункте используется для синхронизации файлов между компьютерами.

Pzz>Напоминает битторрент, однако.


Согласен. .torrent-файл это по сути и есть описание каталога файлов с размерами и хеш-суммами (причём поблочно). Поиска на диске, правда, я не видел, но по сути любому клиенту можно указать нужный каталог и он там проверит, что все файлы соответствуют заданным хеш-суммам и докачает недостающее или несовпадающее.
Crimson
Crimson
01.03.2021 03:05
git ?
velkin
velkin
01.03.2021 03:16
Здравствуйте, Crimson, Вы писали:

C>git ?


Git хранит файлы внутри папки .git, а если их нет, если они валяются где-то в другом месте. Тогда нужен сценарий использования, как осуществить поиск и воссоздание каталога.
Crimson
Crimson
01.03.2021 03:26
V>Git хранит файлы внутри папки .git, а если их нет, если они валяются где-то в другом месте. Тогда нужен сценарий использования, как осуществить поиск и воссоздание каталога.

git умеет
--bare
velkin
velkin
01.03.2021 03:36
Здравствуйте, Crimson, Вы писали:

V>>Git хранит файлы внутри папки .git, а если их нет, если они валяются где-то в другом месте. Тогда нужен сценарий использования, как осуществить поиск и воссоздание каталога.

C>git умеет
C>--bare

Насколько помню когда-то использовал --bare на собственном сервере git.

4.4 Git на сервере Настраиваем сервер

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

Теперь у вас должна быть копия данных из каталога Git в каталоге my_project.git.

Грубо говоря, это эквивалентно команде:

$ cp -Rf my_project/.git my_project.git

Пока что непонятно как это может помочь.
Буравчик
Буравчик
01.03.2021 03:14
Здравствуйте, velkin, Вы писали:

V>1) У приложения есть виртуальный каталог файлов с размерами и хеш-суммами. Программа проходится по диску и воссоздаёт этот каталог в случае нахождения содержимого.


А что такое "виртуальный каталог файлов с размерами и хеш-суммами"?

Делал похожее для себя, складывал размеры и хэши в БД — для дальнейшего анализа.
velkin
velkin
01.03.2021 03:27
Здравствуйте, Буравчик, Вы писали:

Б>А что такое "виртуальный каталог файлов с размерами и хеш-суммами"?


Это путь+размер+хеш-суммы(md5,sha1,...).

Например, сканируем каталог:
mycatalog
mycatalog/movies/bestfilm.mp4 12GB E71D8CD98F20B204E9800498ECF8427E
mycatalog/movies/another.mp4 2.1GB 20B289D68D20B830498E33983720B271
mycatalog/readme.txt          12KB 30498E339832375843006893568D20B8

Чтобы потом можно его воссоздавать, даже если файлы были перемещены в произвольные места диска. Конечно, не хотелось бы совсем примитивный функционал, лучше что-то глобальное для управление на множестве компьютеров. Просто мне в голову ничего особо функционального не идёт или я не знаю правильного сценария использования.
cppguard
cppguard
01.03.2021 08:14
Здравствуйте, velkin, Вы писали:

В такой постановке задача полностью решена протоколом BitTorrent. Реальная сложность, это:
  1. Синхронизация удаления всего файла: удалить везде или только на одной машине?
  2. Синхронизация одновременных изменений в разных частях файла.
  3. Синхронизация изменений на уровне файловой системы.

За адекватный, распределённый, не жрущий ресурсы сервис синхронизации я бы заплатил.
velkin
velkin
02.03.2021 05:46
Здравствуйте, cppguard, Вы писали:

C>В такой постановке задача полностью решена протоколом BitTorrent.


В торренте нет поиска по диску, потому я храню данные вместе с торрент файлом в общем каталоге:
каталог
 каталог_торрента
 каталог_торрента.torrent

C>Реальная сложность, это:
C>Синхронизация удаления всего файла: удалить везде или только на одной машине?
C>Синхронизация одновременных изменений в разных частях файла.
C>Синхронизация изменений на уровне файловой системы.

Для синхронизации мне вспоминаются программы вроде rsync для односторонней синхронизации или syncthing для двусторонней. В комментариях ещё упоминали git, для больших файлов есть проект git-annex. Но всё вышеупомянутое срабатывает не так как нужно по крайне мере у меня.

Из каталогизаторов есть WhereIsIt и WinCatalog, но делают ли они заявленное без понятия. Вроде бы нет, хотя я особо и не смотрел. Если кто знает, пусть напишет.

Что ещё? Распределённые сети обмена данными BitTorrent, DirectConnect и так далее.

Или DropBox как пример файлового хостинга, но его возможности кроме простой закачки и скачки мне неизвестны.

Может ли какой-то файловый менеджер достичь нужной функциональности за счёт плагинов тоже без понятия.

C>За адекватный, распределённый, не жрущий ресурсы сервис синхронизации я бы заплатил.


Мне это представляется таким образом. На каждый компьютер ставится агент, обычно так называют приложение или службу. И он в частности может выглядеть как файловый менеджер. Но в отличие от него имеет базу данных с виртуальными каталогами, термин взят из каталогизаторов файлов упомянутых выше.

Именно эта база данных и синхронизируется между агентами. Сами же файлы при перестроении каталогов берутся с более приоритетных ресурсов, таких как диски и только потом интернет. Опознаются с помощью размеров, хеш-сум. Конечно, хотелось бы ещё иметь контроль повреждений, восстановление и прочее.

Вот такого функционала я и не вижу, потому и задал вопрос.