Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 12:53
Оценка:
Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).

Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.
Отредактировано 01.01.2025 12:54 Alekzander . Предыдущая версия .
Re: Перенос файловой структуры (без файлов)
От: ononim  
Дата: 01.01.25 12:55
Оценка: 18 (1)
A>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).
A>Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.
ничего не понятно, но если rsync такое не сможет, то врядли без скриптования обойдешься
Как много веселых ребят, и все делают велосипед...
Re: Перенос файловой структуры (без файлов)
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.01.25 13:31
Оценка:
Для решения таких, и подобных таким, задач,
придумали git.
Re[2]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 13:54
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Для решения таких, и подобных таким, задач,

ЭФ>придумали git.

Покажи, как гит использовать в этих целях. Естественно, с учётом того, что рассинхрон делается средствами ОС/ФС.
Re: Перенос файловой структуры (без файлов)
От: vsb Казахстан  
Дата: 01.01.25 14:21
Оценка: 18 (1) +1
Здравствуйте, Alekzander, Вы писали:

A>Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.


На всякий случай замечу, что вычисление хеша это тоже дорогая операция. А копирование на некоторых файловых системах — дешёвая операция. Поэтому данное выражение не всегда будет верным.

Помимо упомянутого rsync в некоторых случаях может быть полезен bittorrent. Создать торрент на одном компьютере и скачать на другой в соответствующее место. Там даже по блокам можно разницу будет докачать.

Ещё можно посмотреть на xcopy /z. Не знаю, как он работает, но утверждается, что поддерживает перезапуски копирования, что подразумевает что-то похожее на постановку задачи...
Re: Перенос файловой структуры (без файлов)
От: swame  
Дата: 01.01.25 14:29
Оценка: 18 (1)
Здравствуйте, Alekzander, Вы писали:

A>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).


Это скорее всего одноразовая работа, и критерии сравнения / коллизий кастомные скорее всего, придется подгонять по ходу дела под свои условия.
Писал подобное последнее время на Delphi для реорганизации / переноса кодовой базы, пишется за несколько десятков минут, максимум часов.
Пока спрашиваешь уже можно было несколько раз сделать.

A>Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.


Реально сэкономишь только на очень большом файле. И это только если не вычислять полный хэш.
Обсуждалось в телеге
https://t.me/Delphi_Lazarus/359609

На пачке маленьких — скорее всего будет медленнее.
Отредактировано 01.01.2025 14:59 swame . Предыдущая версия . Еще …
Отредактировано 01.01.2025 14:55 swame . Предыдущая версия .
Отредактировано 01.01.2025 14:55 swame . Предыдущая версия .
Re: Перенос файловой структуры (без файлов)
От: bnk СССР http://unmanagedvisio.com/
Дата: 01.01.25 14:50
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).


Вычисление хешей без какой-либо "предварительной подготовки" так же дорого как и копирование, т.к. тебе придется содержимое файла прочитать как минимум.
Re[2]: Перенос файловой структуры (без файлов)
От: swame  
Дата: 01.01.25 14:50
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Для решения таких, и подобных таким, задач,

ЭФ>придумали git.

В гите используются подобные алгоритмы, но для конкретное задачи он может не подойти.
И на большом объеме он может слишком долго думать (на порядок — два дольше чем скопировать).
Отредактировано 01.01.2025 14:51 swame . Предыдущая версия .
Re[3]: Перенос файловой структуры (без файлов)
От: bnk СССР http://unmanagedvisio.com/
Дата: 01.01.25 14:57
Оценка:
Здравствуйте, Alekzander, Вы писали:

ЭФ>>Для решения таких, и подобных таким, задач,

ЭФ>>придумали git.

A>Покажи, как гит использовать в этих целях. Естественно, с учётом того, что рассинхрон делается средствами ОС/ФС.


Создать два репозитория из твоих папок (git init > git add > git commit) потом объявить что первый это копия второго (git remote add > git fetch) и смержить (git merge --allow-unrelated-histories)
Супер криво, но должно сработать. Как мне кажется rsync гороаздо более прямой вариант.

Вообще вся это возня может быть актуальна IMHO если у тебя терабайты этих файлов и каталогов, а так так тупо копирование любой софтиной-синхронизатором.
Я пользую araxis merge для этого последние 20 лет.
Отредактировано 01.01.2025 15:17 bnk . Предыдущая версия . Еще …
Отредактировано 01.01.2025 15:01 bnk . Предыдущая версия .
Отредактировано 01.01.2025 14:58 bnk . Предыдущая версия .
Отредактировано 01.01.2025 14:58 bnk . Предыдущая версия .
Re[2]: Перенос файловой структуры (без файлов)
От: velkin Земля  
Дата: 01.01.25 15:01
Оценка: -1
Здравствуйте, ononim, Вы писали:

A>>Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.

O>ничего не понятно, но если rsync такое не сможет, то врядли без скриптования обойдешься

Как раз всё понятно. Это называется виртуальный каталог. Автор топика хочет его сделать с контрольными суммами и воссоздавать потом на другом устройстве из файлов, которые там находятся.

Каких программ вам не хватает? (30.10.21 02:25)
Автор: velkin
Дата: 30.10.21

1) Каталогизатор файлов.
Есть программы вроде WhereIsIt и другие, но функционал бедноват. Хотелось бы совмещение виртуальных каталогов с файловой системой, то есть открываешь каталоги как в файловом менеджере, они записываются в базу данных. Хотелось бы вычисление различных хеш-сумм и возможность контроля изменений содержимого директорий и файлов. Опять же автоматическое восстановление виртуальных каталогов, даже если файлы случайно разбросаны по диску. Мгновенный поиск дубликатов по хеш-суммам с досканированием, а не полным пересканированием дисков. А ещё хотелось бы вменяемую синхронизацию файлов между своими устройствами.

Re[3]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 15:04
Оценка:
Здравствуйте, velkin, Вы писали:

V>1) Каталогизатор файлов.

V>Хотелось бы совмещение виртуальных каталогов с файловой системой, то есть открываешь каталоги как в файловом менеджере, они записываются в базу данных.
V>[/q]

Может, я не очень понимаю написанное, но "совмещение виртуальных каталогов с файловой системой" звучит как экспорт-импорт Шаропоинта. А тут речь о двух обычных файловых системах, структуру одной из которых надо подстроить под вторую, и промежуточная база данных не нужна.
Re: Перенос файловой структуры (без файлов)
От: Shmj Ниоткуда  
Дата: 01.01.25 15:15
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).


У меня есть на скорую руку созданное на C++ QT — кроссплатформа, которое умеет:

1. Пройтись по всем файлам и в заданной директории и сформировать XML-дерево, которое отображает структуру файловой системы.

2. Вычислить для каждого файла хеш-сумму и добавить в дерево. У меня было 300+ Гб и около 2 млн. файлов — заняло несколько часов.

3. Найти уникальные хеши и скопировать соответствующие им файлы в одну папку, частично сохраняя название и расширение (но добавляя уникальности в имя).

4. Восстановить файловую структуру на основе XML и папки с файлами.
=сначала спроси у GPT=
Отредактировано 01.01.2025 15:18 Shmj . Предыдущая версия .
Re[4]: Перенос файловой структуры (без файлов)
От: velkin Земля  
Дата: 01.01.25 15:22
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Может, я не очень понимаю написанное, но "совмещение виртуальных каталогов с файловой системой" звучит как экспорт-импорт Шаропоинта. А тут речь о двух обычных файловых системах, структуру одной из которых надо подстроить под вторую, и промежуточная база данных не нужна.


Если кратко кривые способы тебе уже показали.
1. rsync — односторонняя синхронизация.
2. syncthing — двусторонняя синхронизация.
3. git — распределённое хранилище.

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

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

Хотел сам такое написать, но забил. Торренты к сожалению из-за защиты могут не дать такой функционал. Можешь ещё посмотреть Direct Connect для саморазвития.

Сам подумай почему я написал топик про то каких программ мне не хватает. Люди в том числе и здесь годами пишут одно и тоже, но софта нет или мне неизвестен.
Re[4]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 18:10
Оценка:
Здравствуйте, bnk, Вы писали:

A>>Покажи, как гит использовать в этих целях. Естественно, с учётом того, что рассинхрон делается средствами ОС/ФС.


bnk>Создать два репозитория из твоих папок (git init > git add > git commit) потом объявить что первый это копия второго (git remote add > git fetch) и смержить (git merge --allow-unrelated-histories)

bnk>Супер криво, но должно сработать. Как мне кажется rsync гороаздо более прямой вариант.

Просто стереть и заново скопировать будет лучше )
Re[2]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 18:12
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Помимо упомянутого rsync в некоторых случаях может быть полезен bittorrent. Создать торрент на одном компьютере и скачать на другой в соответствующее место. Там даже по блокам можно разницу будет докачать.


А это точно не включает в себя исходную задачу? Интуиция гвоорит, что да, но я не уверен.

vsb>Ещё можно посмотреть на xcopy /z. Не знаю, как он работает, но утверждается, что поддерживает перезапуски копирования, что подразумевает что-то похожее на постановку задачи...
Re[2]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 18:14
Оценка:
Здравствуйте, swame, Вы писали:

S>Реально сэкономишь только на очень большом файле. И это только если не вычислять полный хэш.

S>Обсуждалось в телеге
S>https://t.me/Delphi_Lazarus/359609

Да, для контентных файлов хеш не нужен.
Re[2]: Перенос файловой структуры (без файлов)
От: Alekzander Россия  
Дата: 01.01.25 18:16
Оценка:
Здравствуйте, Shmj, Вы писали:

A>>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).


S>У меня есть на скорую руку созданное на C++ QT — кроссплатформа, которое умеет:


S>1. Пройтись по всем файлам и в заданной директории и сформировать XML-дерево, которое отображает структуру файловой системы.


S>2. Вычислить для каждого файла хеш-сумму и добавить в дерево. У меня было 300+ Гб и около 2 млн. файлов — заняло несколько часов.


S>3. Найти уникальные хеши и скопировать соответствующие им файлы в одну папку, частично сохраняя название и расширение (но добавляя уникальности в имя).


S>4. Восстановить файловую структуру на основе XML и папки с файлами.


Да, но тут, насколько я понимаю, нет переименования.
Re[3]: Перенос файловой структуры (без файлов)
От: Shmj Ниоткуда  
Дата: 01.01.25 18:46
Оценка:
Здравствуйте, Alekzander, Вы писали:

S>>У меня есть на скорую руку созданное на C++ QT — кроссплатформа, которое умеет:


S>>1. Пройтись по всем файлам и в заданной директории и сформировать XML-дерево, которое отображает структуру файловой системы.


S>>2. Вычислить для каждого файла хеш-сумму и добавить в дерево. У меня было 300+ Гб и около 2 млн. файлов — заняло несколько часов.


S>>3. Найти уникальные хеши и скопировать соответствующие им файлы в одну папку, частично сохраняя название и расширение (но добавляя уникальности в имя).


S>>4. Восстановить файловую структуру на основе XML и папки с файлами.


A>Да, но тут, насколько я понимаю, нет переименования.


Есть сравнение по содержимому файла — не важно имя. Потом по заданному XML — создаете нужную структуру с именами из XML (и хешем из XML), но берем файлы из общего каталога на основе хеша.

Т.е. оно создает базу файлов — все в одной папке. А не, не в одной — в подпапках по расширению, вспомнил. Это удобно, к примеру. чтобы посмотреть все картинки. Имена делает чуть измененные в этой базе, т.к. могут быть разные файлы с одинаковыми именами.

А далее — подсовываете любой XML-файл с заданной структурой — и оно воссоздает заново файловую структуру по XML. Имена файлов и папок — из XML, содержимое файлов — из той папке, где все по расширениям раскидано. Естественно для той папки так же есть XML для быстрого поиска по словарю.

Есть исходники, все работает. Но все делалось на скорую руку, не вылизывал.
=сначала спроси у GPT=
Отредактировано 01.01.2025 19:10 Shmj . Предыдущая версия .
Re: Перенос файловой структуры (без файлов)
От: Vetal_ca Канада http://vetal.ca
Дата: 01.01.25 18:55
Оценка: 21 (1)
Здравствуйте, Alekzander, Вы писали:

A>Есть два стула каталога. Один появился как копия другого. Затем файлы переименовывали, раскладывали по каталогам, и т.д. Есть ли инструмент, который воссоздаст структуру в одном из них по образцу второго? Примерно как копировщик, но прежде, чем копировать тела файлов, он должен сравнить между собой все хеши, и при совпадении -- использовать имеющиеся файлы как источник (т.е. переименовать их).


A>Смысл в том, что переименование -- дешёвая операция, а копирование -- дорогая.


https://freefilesync.org/
Re[2]: Перенос файловой структуры (без файлов)
От: m2user  
Дата: 01.01.25 22:25
Оценка: +1
bnk>Вычисление хешей без какой-либо "предварительной подготовки" так же дорого как и копирование, т.к. тебе придется содержимое файла прочитать как минимум.

Полагаю, что у ТС между каталогами "дорого" перемещать данные, а внутри читать "дешёво" (например каталоги в разных геолокациях).
В этом случае задача сводится к тому чтобы для обоих каталога посчитать таблицу "хэш — полный путь", отсортировать по хешам и подвигать файлы во втором каталоге.

Считаем хэши и сохраняем на файловую систему в файлы, где хэш в имени, и список путей в содержимом:
#!/bin/sh

find "$1" -type f -exec sh -c 'hash=$(sha256sum "$1" -z | head -c 64); echo "$1" >> $0/$hash' "$2" {} \;

Первый аргумент — относительный путь в каталог с файлами, второй — путь к каталогу с результатом расчета.

Сохраняем результат как архив и переносим на дискете в другую локацию.

Во-второй локации строим аналогичный каталог с хэшами и затем двигаем (в данной реализации копируем) файлы:
#!/bin/sh
  
ls $1 | while read hash_file; do
        tail -1 $1/$hash_file | while read path; do
                cat $2/$hash_file | while read path2; do
                mkdir -p "$path2" && rmdir "$path2"
                cp -pPrx "$path" "$path2"
                done
        done
done

Первый аргумент — каталог с хэшами второй локации, второй аргумент — каталог с хэшами первой локации.
Скрипт копирует файлы по абсолютному (или относительному) пути взятому _без изменений_ из первой локации.

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