Вот что я сделал сейчас:
Я создал новый пустой каталог и импортировал изображения из старой структуры папок c:\photos\yyyy\mm\dd и d:\pictures\yyyy\mm\dd в новую структуру \\nas\photos\yyyy\yyyy-mm\yyyy-mm-dd.
Затем я открыл объединенный каталог со своими метаданными, в которых теперь указаны все отсутствующие фотографии. Я использовал «Найти недостающую папку» в корневых папках yyyy, которые объединили старые корни c: и d:, но указали, что папки mm month все еще отсутствуют.
Затем я закрыл Lightroom, открыл файл .lrcat в sqlitestudio и выполнил эти запросы, которые переписывают yyyy\mm\dd в yyyy\yyyy-mm\yyyy-mm-dd и yyyy\yyyy-mm-dd в yyyy\yyyy-mm\yyyy-mm-dd, если папка yyyy является корнем.
-- yyyy/mm/dd => yyyy/yyyy-mm/yyyy-mm-dd
replace into aglibraryfolder (id_local, id_global, pathFromRoot, rootFolder)
select aglibraryfolder.id_local, aglibraryfolder.id_global,
name || '-' || substr(pathFromRoot, 1, 2) || '/' || name || '-'
|| substr(pathFromRoot, 1, 2) || '-' || substr(pathFromRoot, 4, 2)
|| '/' as pathFromRoot,
aglibraryfolder.rootFolder
from aglibraryfolder, aglibraryrootfolder
where aglibraryfolder.rootFolder = aglibraryrootfolder.id_local
and cast(name as integer) > 1000 and name glob '????'
and pathFromRoot glob '??/??/' ;
-- yyyy/yyyy-mm-dd => yyyy/yyyy-mm/yyyy-mm-dd
replace into aglibraryfolder (id_local, id_global, pathFromRoot, rootFolder)
select aglibraryfolder.id_local, aglibraryfolder.id_global,
substr(pathFromRoot, 1, 7) || '/' || pathFromRoot as pathFromRoot,
aglibraryfolder.rootFolder
from aglibraryfolder, aglibraryrootfolder
where aglibraryfolder.rootFolder = aglibraryrootfolder.id_local
and pathFromRoot glob '????-??-??/'
and cast(name as integer) > 1000
and name == substr(pathFromRoot, 1, 4) ;
После повторного открытия каталога все в порядке, осталось несколько пустых папок с месяцами, их можно удалить.