Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Поменять Junction на относительные символьные ссылки

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
HankHank



Joined: 15 Apr 2010
Posts: 39

Post (Separately) Posted: Wed Jan 26, 2022 00:20    Post subject: Поменять Junction на относительные символьные ссылки Reply with quote

Доброго времени суток.

Есть фонотека на нескольких USB HDD, которой не один десяток лет.
В ней в изобилии используются точки соединения (Junction). Так было легче структурировать музыку.
Изначально предполагалось работать с этими дисками, монтируя их каждый раз на букву “H:”.
Однако, надоело заморачиваться с монтированием.

Может, кто-то сталкивался с подобной задачей.
Хотелось бы найти способ автоматизировать замену точек соединения на относительные символьные ссылки.
Всё равно, с помощью TC или как-то иначе.

Спасибо.
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 39

Post (Separately) Posted: Wed Jan 26, 2022 16:22    Post subject: Reply with quote

Найти все точки соединения в 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/sysinternals/downloads/junction .

Для получения Рального пути ей в качестве параметра надо подсунуть найденную точку соединения:
junction.exe <junction directory>

Вот так (ещё один способ, 4-ый) можно организовать рекурсивный вывод всех точек соединения из текущей папки:
junction.exe –s .

А так можно аккуратно удалять точки соединения:
junction.exe -d <junction directory>

Осталось объединить NTLinks Maker, утилиту Руссиновича и соорудить скрипт в командном процессоре...
В этом я не силён. ((
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 39

Post (Separately) Posted: Thu Jan 27, 2022 16:03    Post subject: Формализованная задача Reply with quote

Задача формализована.

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

dir /AL /S H:\ >JtoS.txt

В итоге JtoS.txt содержит регулярную структуру данных. Например:

Code:

 Том в устройстве 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 вставляется в шаблон без особых хлопот.
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 39

Post (Separately) Posted: Thu Jan 27, 2022 22:25    Post subject: Reply with quote

Код для скрипта может быть ещё проще, если использовать команду

DIR /AL /B /S H:\

Тогда получим строки с полными путями к ссылкам:

Code:

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)



А, еcли вызвать FSUTIL, указав ему ссылку, то получим список строк, в котором нас интересует “Print Name:”.

Например:

FSUTIL reparsepoint query “H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)”

Code:

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)



Т.о., проблемы со спецсимволами в именах папок сокращаются.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jan 28, 2022 09:50    Post subject: Reply with quote

На самом деле, Substitute Name важнее, т.к. именно оно идентифицирует цель, в то время как Print Name предназначено только для визуальной идентификации цели (префикс только откусить надо):
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ca069dad-ed16-42aa-b057-b6b207f447cc

А для создания относительной ссылки должна работать такая команда (при запуске от администратора):
Code:
NTLinksMaker.exe /q /sr /n <src_path> <link_path>

_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 39

Post (Separately) Posted: Sun Jan 30, 2022 17:26    Post subject: Тема исчерпана Reply with quote

Решение задачи нашлось быстрее, чем предполагалось изначально.
Сердечная благодарность коллегам за неформальное и оперативное участие.

Удачи всем нам!
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Feb 04, 2022 15:32    Post subject: Reply with quote

Предлагаю поделиться окончательным вариантом решения, авось кому еще пригодится.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group