Поменять Junction на относительные символьные ссылки
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Поменять Junction на относительные символьные ссылки
Доброго времени суток.
Есть фонотека на нескольких USB HDD, которой не один десяток лет.
В ней в изобилии используются точки соединения (Junction). Так было легче структурировать музыку.
Изначально предполагалось работать с этими дисками, монтируя их каждый раз на букву “H:”.
Однако, надоело заморачиваться с монтированием.
Может, кто-то сталкивался с подобной задачей.
Хотелось бы найти способ автоматизировать замену точек соединения на относительные символьные ссылки.
Всё равно, с помощью TC или как-то иначе.
Спасибо.
Есть фонотека на нескольких USB HDD, которой не один десяток лет.
В ней в изобилии используются точки соединения (Junction). Так было легче структурировать музыку.
Изначально предполагалось работать с этими дисками, монтируя их каждый раз на букву “H:”.
Однако, надоело заморачиваться с монтированием.
Может, кто-то сталкивался с подобной задачей.
Хотелось бы найти способ автоматизировать замену точек соединения на относительные символьные ссылки.
Всё равно, с помощью TC или как-то иначе.
Спасибо.
Найти все точки соединения в TC понятно, как:
Поиск файлов – вкладка Плагины.
У меня есть оба-два плагина: ntlinks и nl_info.
По обоим поиск получается.
В ntlinks: Тип объекта = Точка соединения
В nl_info: Тип символической ссылки (расш) = Junction
Можно получить простыню с интересующими ссылками из комстроки:
dir /AL /S H:\ | find "JUNCTION"
Что дальше делать?
Руками всё лопатить немыслимо.
По смыслу осталось совсем чуть-чуть: ))
Взять Реальный путь и Целевой объект.
Аккуратно удалить существующую Junction.
Создать Относительную символьную ссылку, используя Целевой объект и Реальный путь.
Выполнить цикл по всему диску.
Posted after 1 hour 54 minutes:
Помимо NTLinks Maker http://wincmd.ru/plugring/NTLinksMaker.html
существует утилита Руссиновича
https://docs.microsoft.com/ru-ru/sysint ... s/junction .
Для получения Рального пути ей в качестве параметра надо подсунуть найденную точку соединения:
junction.exe <junction directory>
Вот так (ещё один способ, 4-ый) можно организовать рекурсивный вывод всех точек соединения из текущей папки:
junction.exe –s .
А так можно аккуратно удалять точки соединения:
junction.exe -d <junction directory>
Осталось объединить NTLinks Maker, утилиту Руссиновича и соорудить скрипт в командном процессоре...
В этом я не силён. ((
Поиск файлов – вкладка Плагины.
У меня есть оба-два плагина: ntlinks и nl_info.
По обоим поиск получается.
В ntlinks: Тип объекта = Точка соединения
В nl_info: Тип символической ссылки (расш) = Junction
Можно получить простыню с интересующими ссылками из комстроки:
dir /AL /S H:\ | find "JUNCTION"
Что дальше делать?
Руками всё лопатить немыслимо.
По смыслу осталось совсем чуть-чуть: ))
Взять Реальный путь и Целевой объект.
Аккуратно удалить существующую Junction.
Создать Относительную символьную ссылку, используя Целевой объект и Реальный путь.
Выполнить цикл по всему диску.
Posted after 1 hour 54 minutes:
Помимо NTLinks Maker http://wincmd.ru/plugring/NTLinksMaker.html
существует утилита Руссиновича
https://docs.microsoft.com/ru-ru/sysint ... s/junction .
Для получения Рального пути ей в качестве параметра надо подсунуть найденную точку соединения:
junction.exe <junction directory>
Вот так (ещё один способ, 4-ый) можно организовать рекурсивный вывод всех точек соединения из текущей папки:
junction.exe –s .
А так можно аккуратно удалять точки соединения:
junction.exe -d <junction directory>
Осталось объединить NTLinks Maker, утилиту Руссиновича и соорудить скрипт в командном процессоре...
В этом я не силён. ((
Формализованная задача
Задача формализована.
На томе содержатся исключительно JUNCTION, созданные одним и тем же плагином. Вид их одинаков.
Информация обо всех JUNCTION вываливается в файл:
dir /AL /S H:\ >JtoS.txt
В итоге JtoS.txt содержит регулярную структуру данных. Например:
Очевидно, вся информация, нужная для реорганизации дисков, присутствует.
Формально нужно организовать цикл по секциям, начинающимся со строк “Содержимое папки”.
В каждой секции пройти по строкам, содержащим “<JUNCTION>”, каждый раз в переменную %t помещая содержимое квадратных скобок без символов “\??\” (целевой объект), а в переменную %l – ссылку.
Для первого вхождения:
%t = “H:\Фонотека\Jazz - fusion\Baldauf Rudiger”,
%l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Baldauf Rudiger”.
Для второго вхождения:
%t = “h:\Фонотека\Jazz\Beiderbecke Leon Bix”,
%l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Beiderbecke Leon Bix”.
и т.д.
%t лежит внутри “[\??\ ... ]”.
%l образуется конкатенацией строки, стоящей следом за “Содержимое папки” , бэк-слеша и строки, стоящей между “<JUNCTION>” и строкой ”[\??\“ без лидирующих и замыкающих пробелов.
В именах файлов, кроме русских букв, могут встречаться спецсимволы (,;:_ и т.п.).
Процедура замены JUNCTION на SYMLINKD понятна. Для этого есть соответствующая команда NTLinks Maker. Есть ещё и штатная команда MKLINK /D ...
Требуется, по возможности, помощь в шаблоне обработки.
Процедура замены с удалением JUNCTION и созданием SYMLINKD вставляется в шаблон без особых хлопот.
На томе содержатся исключительно JUNCTION, созданные одним и тем же плагином. Вид их одинаков.
Информация обо всех JUNCTION вываливается в файл:
dir /AL /S H:\ >JtoS.txt
В итоге JtoS.txt содержит регулярную структуру данных. Например:
Код: Выделить всё
Том в устройстве H имеет метку 2 NTFS
Серийный номер тома: CAE4-9F0A
Содержимое папки H:\Слушать\Слушать\ Инструменты\Труба (trumpet)
09.12.2010 23:43 <JUNCTION> Baldauf Rudiger [\??\H:\Фонотека\Jazz - fusion\Baldauf Rudiger]
29.10.2011 02:21 <JUNCTION> Beiderbecke Leon Bix [\??\h:\Фонотека\Jazz\Beiderbecke Leon Bix]
...
0 файлов 0 байт
...
Содержимое папки H:\Слушать\Слушать\Modern jazz
09.10.2010 08:28 <JUNCTION> Lloyd Charles [\??\H:\Фонотека\Jazz - avant-guard\Lloyd Charles]
0 файлов 0 байт
Содержимое папки H:\Слушать\Слушать\Smooth
23.08.2010 21:29 <JUNCTION> Blake Aaron - Desire (2007) [\??\H:\Фонотека\Jazz - smooth\Aaron Blake\Blake Aaron - Desire (2007)]
02.09.2010 18:56 <JUNCTION> Club des Belugas - Swop (2008) [\??\H:\Фонотека\Jazz - smooth\ Various\Club des Belugas - Swop (2008)]
...
0 файлов 0 байт
Всего файлов:
1 файлов 0 байт
665 папок 316*940*726*272 байт свободно
Формально нужно организовать цикл по секциям, начинающимся со строк “Содержимое папки”.
В каждой секции пройти по строкам, содержащим “<JUNCTION>”, каждый раз в переменную %t помещая содержимое квадратных скобок без символов “\??\” (целевой объект), а в переменную %l – ссылку.
Для первого вхождения:
%t = “H:\Фонотека\Jazz - fusion\Baldauf Rudiger”,
%l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Baldauf Rudiger”.
Для второго вхождения:
%t = “h:\Фонотека\Jazz\Beiderbecke Leon Bix”,
%l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Beiderbecke Leon Bix”.
и т.д.
%t лежит внутри “[\??\ ... ]”.
%l образуется конкатенацией строки, стоящей следом за “Содержимое папки” , бэк-слеша и строки, стоящей между “<JUNCTION>” и строкой ”[\??\“ без лидирующих и замыкающих пробелов.
В именах файлов, кроме русских букв, могут встречаться спецсимволы (,;:_ и т.п.).
Процедура замены JUNCTION на SYMLINKD понятна. Для этого есть соответствующая команда NTLinks Maker. Есть ещё и штатная команда MKLINK /D ...
Требуется, по возможности, помощь в шаблоне обработки.
Процедура замены с удалением JUNCTION и созданием SYMLINKD вставляется в шаблон без особых хлопот.
Код для скрипта может быть ещё проще, если использовать команду
DIR /AL /B /S H:\
Тогда получим строки с полными путями к ссылкам:
А, еcли вызвать FSUTIL, указав ему ссылку, то получим список строк, в котором нас интересует “Print Name:”.
Например:
FSUTIL reparsepoint query “H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)”
Т.о., проблемы со спецсимволами в именах папок сокращаются.
DIR /AL /B /S H:\
Тогда получим строки с полными путями к ссылкам:
Код: Выделить всё
H:\Слушать\Слушать\Albright Gerald
H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)
H:\Слушать\Слушать\Dave Brubeck - Ken Burns Jazz (Columbia - Legacy Records) 2000
H:\Слушать\Слушать\Dino Saluzzi - El Encuentro (2010) [Flac]
H:\Слушать\Слушать\Modern Jazz Quartet - Live At The Lighthouse (MFSL MFCD 827) (1967)
…
Например:
FSUTIL reparsepoint query “H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)”
Код: Выделить всё
Reparse Tag Value : 0xa0000003
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Mount Point
Substitue Name offset: 0
Substitue Name length: 184
Print Name offset: 186
Print Name Length: 176
Substitute Name: \??\h:\Фонотека\Jazz\Rostotsky Alex\Alex Rostotsky - Time when fish think of the past (2004)
Print Name: h:\Фонотека\Jazz\Rostotsky Alex\Alex Rostotsky - Time when fish think of the past (2004)
…
На самом деле, Substitute Name важнее, т.к. именно оно идентифицирует цель, в то время как Print Name предназначено только для визуальной идентификации цели (префикс только откусить надо):
https://docs.microsoft.com/en-us/opensp ... b207f447cc
А для создания относительной ссылки должна работать такая команда (при запуске от администратора):
https://docs.microsoft.com/en-us/opensp ... b207f447cc
А для создания относительной ссылки должна работать такая команда (при запуске от администратора):
Код: Выделить всё
NTLinksMaker.exe /q /sr /n <src_path> <link_path>Тема исчерпана
Решение задачи нашлось быстрее, чем предполагалось изначально.
Сердечная благодарность коллегам за неформальное и оперативное участие.
Удачи всем нам!
Сердечная благодарность коллегам за неформальное и оперативное участие.
Удачи всем нам!