Создать относительную символическую ссылку в Windows 10 для копий файлов

2433
Stephen Hanson

Я собираюсь резко упростить все, что я пробовал. Для точных деталей, пожалуйста, просмотрите скриншот CMD .

Я хочу создать символическую ссылку RELATIVE PATH с именем [ RESOURCES ]по следующему пути:

C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music 

Это должно указывать на:

C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\{[ LONGCHAR REDIRECT ]} 

Я пытался mklink /Dв cmd как администратор, со следующими шагами.

  1. Перейдите в каталог, в котором должна быть создана символическая ссылка.

    cd "C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music" 
  2. Создайте символическую ссылку.

    mklink /d "[ RESOURCES ]" "../../../{[ LONGCHAR REDIRECT ]}" symbolic link created for [ RESOURCES ] <<===>> ../../../{[ LONGCHAR REDIRECT ]} 

В меру моего понимания, этот синтаксис следует установить ссылку {[ LONGCHAR REDIRECT ]}на [ SOURCE ]относительно, Musicно это не так!

Подтверждение указывает, что ссылка была создана успешно, но когда я пытаюсь получить доступ к символической ссылке, я получаю следующую ошибку:

cd "C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music\[ RESOURCES ]" C:\Users\crack\Documents\[ GLOBAL ]\[ SOURCE ]\[ INITIATIVES ]\Audio\Music\[ RESOURCES ] is not accessible.   The filename, directory name, or volume label syntax is incorrect. 

Я неправильно понимаю использование ..для указания родительского каталога? Опять же, пожалуйста, не стесняйтесь просматривать мои многочисленные эксперименты через скриншот CMD . Я попытался несколько вариаций на тему относительного пути к файлу, используя .., .и изменения вокруг текущего каталога.

Если mklinkне будет реализована желаемая связь, пожалуйста, не стесняйтесь рекомендовать альтернативный путь к файлу. Я копирую [ GLOBAL ]каталог на различные диски и службы резервного копирования, поэтому мне нужно, чтобы пути к файлам были усечены до предела с учетом 260 MAX_PATHих фактического расположения в {[ LONGCHAR REDIRECT ]}папке, чтобы они отражались в каждом дублирующем местоположении, но мне нужно, чтобы мой рабочий каталог включал их виртуальные расположения в [ RESOURCES ]папка.

0
Ваш пример ошибки фактически отсутствует на скриншоте. Использование менее кричащих (все заглавные) имен сделало бы это намного легче для глаз. Seth 6 лет назад 0
Снимок экрана - это "все, что я пробовал". Диалоговое окно с кавычками должно быть более чем достаточно, чтобы передать точную ошибку. Stephen Hanson 6 лет назад 0

3 ответа на вопрос

1
Seth

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

mkdir C:\temp\example\a mkdir C:\temp\example\b\c mklink /D C:\temp\example\a\redirection ..\b 

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

Вы понимаете, что это Super User, верно? Просьба найти какое-либо приложение для использования длинных имен файлов кажется мне неработающим решением. Я использую несколько приложений, которые используют совместимые 260 имен MAX_PATH. Если вы можете сослаться на меня в документации, которая указывала бы на иное, например, на то, что ВСЕ приложения будут обрабатывать перегруженное имя файла, я мог бы рассмотреть возможность переключения. В противном случае ваше предложение бесполезно. Stephen Hanson 6 лет назад 0
Кроме того, я определил, что ваше предположение, что это были только косые черты, чтобы быть неполным. Проблема заключалась в том, что ОБА косые черты, И тот факт, что в моем имени пути были пробелы. Для записи, решение, которое я только что обнаружил, было следующей командой: C: \ Users \ crack \ Documents \ [GLOBAL] \ [SOURCE] \ [INITIATIVES] \ Audio \ Music> mklink / D "[RESOURCES]" .. \ .. \ .. \ "{[LONGCHAR REDIRECT]}" Я не знал, что вы можете использовать кавычки в сочетании с операторами без кавычек "..". Stephen Hanson 6 лет назад 0
@Seth Slashes работает для mklink в cmd.exe в общем, только что проверил, что: 'mklink / J target "src / murks" в "src" работает и делает "murks" доступными в качестве цели. Thorsten Schöning 6 лет назад 0
@StephenHanson Вы говорите только о «копировании» вещей и целях резервного копирования, а приложения, такие как XCOPY или ROBOCOPY, отлично способны обрабатывать длинные имена файлов Unicode, любое разумное приложение резервного копирования также должно быть или просто сломано. Так что, если вы не расскажете более подробно о приложениях, которые вы используете, то не стоит использовать их, если они не поддерживают длинные имена файлов. Thorsten Schöning 6 лет назад 1
@Thorsten Почему существует предел MAX_PATH, если я должен просто игнорировать его? Я предполагаю, что они должны сохранять целостность стандартных приложений и условий работы операционной системы Windows. Когда я начну разрабатывать свои собственные приложения, я перейду к переполнению стека, и ваш ответ будет разумным. Но для повседневных "суперпользователей" обход соглашений с файловой системой кажется безответственным. Stephen Hanson 6 лет назад 0
Также @Thorsten, сами приложения тоже не проблема. Даже ручное перемещение / удаление / изменение файлов вызывает проблемы, когда файлы превышают длину MAX_PATH. У меня было достаточно головных болей. Stephen Hanson 6 лет назад 0
@StephenHanson MAX_PATH из-за обратной совместимости со старыми унаследованными приложениями, выпущенными только для DOS и не Windows NT, у Microsoft есть довольно хорошие документы по этой теме: https://msdn.microsoft.com/en-us/library/windows/desktop/ aa365247 (v = vs.85) .aspx # maxpath Thorsten Schöning 6 лет назад 1
@ ThorstenSchöning спасибо за указание на это. Я добавил эту информацию. В этом конкретном случае, поскольку он хочет сослаться на родителя, это не работает. Seth 6 лет назад 0
@StephenHanson, так что вы уже активно обходите / игнорируете `MAX_PATH`, но предлагаете исправить либо приложения, которые вы используете (с помощью эквивалентов, которые обрабатывают более длинные пути, либо с помощью индикатора пути, у которого нет этого предела), или исправление вашего структура файла не является жизнеспособной? Кроме того, да, вам нужно использовать кавычки для путей, которые содержат пробелы. Ваш пример уже показал, что вы, кажется, знаете об этом, поэтому MWE сосредоточился только на ссылке. Который не работал, потому что вам нужны обратные слеши. Seth 6 лет назад 0
@Seth Мое утверждение не было ясным, хотя Slashes работают вообще, они не для символических ссылок, как вы сказали. Я пробовал только с Junctions, они обрабатываются по-разному, их путь определяется по-разному, в то время как пути для символьных ссылок хранятся для символической ссылки в виде текста. В этих случаях вы, безусловно, правы, /, скорее всего, никогда не поддерживается. Thorsten Schöning 6 лет назад 0
@Seth Создание работающего обходного пути с использованием встроенных команд через командную строку не является «обходом» в той же степени, в которой ненужное превышение реализации MAX_PATH небрежно по отношению к создателю. Файлы в моем решении прекрасно управляются с помощью ручных манипуляций, выполняемых единственным пользователем. Файлы, которые превышают MAX_PATH, однако, не являются. Ваша грубая сила - общесистемная мера безопасности и стабильности. Мой просто создает рабочие ссылки на файлы, которые полностью соответствуют рабочим возможностям любого, кто разрабатывает приложения, разработанные в соответствии с правилами. Stephen Hanson 6 лет назад 0
1
Thorsten Schöning

Три вещи:

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

  2. Попробуйте заменить программное обеспечение, которое не поддерживает длинные имена файлов Unicode, что возможно довольно часто. Эти длинные имена файлов существуют со времен NTFS и Windows NT, поэтому программное обеспечение просто должно их поддерживать, и многие фреймворки / среды выполнения, такие как Java, делают это из коробки. Программное обеспечение, предназначенное для копирования или резервного копирования, которое не поддерживает длинные имена файлов, в значительной степени сломано и, несомненно, имеет и другие серьезные ограничения, особенно в случае резервного копирования. Подумайте о таких вещах, как разрешения, правильная обработка различных ссылок и типов файлов, альтернативные потоки данных и т. Д. Нужно быть осторожным.

  3. Причиной вашей реальной проблемы, похоже, являются различия в символических ссылках и соединениях или, возможно, различия в том, как анализируются пути, предоставляемые оболочкой:

C: \ Users \ tschoening \ Documents \ test \ target> mklink / J "[target]" "../ src / {[murks]}"

Verbindung erstellt für [target] << === >> ../ src / {[murks]}

C: \ Users \ tschoening \ Documents \ test \ target> cd "[target]"

C: \ Users \ tschoening \ Documents \ test \ target [target]> cd ..

C: \ Users \ tschoening \ Documents \ тест \ цель>

Как вы можете видеть, такой способ доступа к «[target]» работает, в то время как следующее не дает и генерирует ту же ошибку, что и у вас, только на немецком языке:

C: \ Users \ tschoening \ Documents \ test \ target> mklink / D "[target]" "../ src / {[murks]}"

symbolische Verknüpfung erstellt für [target] << === >> ../ src / {[murks]}

C: \ Users \ tschoening \ Documents \ test \ target> cd "[target]"

Синтаксис для даты, времени и времени, фальш.

C: \ Users \ tschoening \ Documents \ тест \ цель>

По крайней мере, я не вижу никакой другой разницы, чем / J против / D в моем тесте, но я могу что-то упустить, конечно. Поэтому я предлагаю повторить ваш тест, используя самих переходов.

Еще одна интересная вещь, которую я только что узнал: открытие созданной символической ссылки с приведенным выше синтаксисом в cmd.exe и Windows Explorer напрямую завершается ошибкой, но в Link Shell Extension это происходит успешно. Посмотрите на следующий снимок экрана, на котором показан относительный путь. При нажатии «Ziel öffnen» открывается новая папка Windows Explorer с указанием цели ссылки. Похоже, расширение Link Shell интерпретирует / само и может предоставить \ для базового API Windows? То, чего сама Windows не делает, а просто использует / как указано в самой ссылке, что неправильно для путей. Так как @Seth уже распознал, сама проблема / является проблемой с символическими ссылками.

Расширение Link Shell, показывающее протестированную символическую ссылку

Я запросил символические ссылки и прямо заявил, что мне нужны ОТНОСИТЕЛЬНЫЕ пути к файлам. Да, вы пропустили, что символические ссылки поддерживают ОТНОСИТЕЛЬНЫЕ пути к файлам, а переходы - НЕ. Конечно я админ. Как еще я мог бы установить программное обеспечение? Вы также, кажется, упускаете тот факт, что превышение MAX_PATH приводит к сбою ручных манипуляций с файлами. Кроме того, я ответил на мой собственный вопрос, если вам было интересно узнать о фактической проблеме. Это была достаточно простая модификация синтаксиса. Stephen Hanson 6 лет назад 0
@StephenHanson Я использую относительные пути к файлам в моем тесте. Кроме того, в вашем случае Junctions предоставляют те же функциональные возможности, что и настоящие символические ссылки, без оговорок о необходимости получения разрешений администратора, и, как правило, не нужно быть администратором все время, чтобы устанавливать программное обеспечение или управлять им только один раз. На самом деле, это просто плохая практика - быть админом все время, поэтому, по возможности, предпочтительнее использовать Junctions. Thorsten Schöning 6 лет назад 0
Если ваша папка "src" находится в вашей "тестовой" папке, то вы создаете JUNCTION с путем к файлу ABSOLUTE. Stephen Hanson 6 лет назад 0
@StephenHanson Мне было непонятно, что вы хотите скопировать и саму ссылку с ее относительным путем. Не сильно меняется, ваш подход все еще имеет различные предостережения: вам нужно иметь специальные разрешения повсюду для создания символической ссылки, вам нужны инструменты, которые могут обрабатывать символическую ссылку по-другому, вы, кажется, создали круг в своей структуре dir, если вы копируете GLOBAL, что может привести к сбою некоторых инструментов и т. д. Thorsten Schöning 6 лет назад 1
0
Stephen Hanson

Во-первых, мы должны взглянуть на синтаксис опций и обязательных параметров, сгенерированных путем ввода mklinkкоманды help help mklink /?:

MKLINK [[/D] | [/H] | [/J]] Link Target  /D Creates a directory symbolic link. Default is a file symbolic link. /H Creates a hard link instead of a symbolic link. /J Creates a Directory Junction. Link Specifies the new symbolic link name. Target Specifies the path (relative or absolute) that the new link refers to. 

В настоящее время возможно вставить данные относительного пути файла только в символьные ссылки каталога.

Следовательно, мы должны использовать mklinkкоманду вместе с mklinkопцией команды («soft link»), /Dвот так.

mklink /D,, ,

mklink TargetПараметр должен описать FilePath, который включает по меньшей мере один RELATIVE Filepath оператора таких, как .или ..в сочетании с таким количеством слэша ( \), как потребовал относительной иерархии (Grand-, большого-Grand- и т.д.) родительских каталогов, а также "DOUBLE-QUOTED "путь_к_файл в любом случае, когда один или несколько пробельных символы требуется ребенок АБСОЛЮТНОГО фрагментом Filepath из к-быть-каскадной относительной удерживающим звено mklink TargetFilePath.

Остроумия, заканчивая команду

mklink /D "C:/Test Folder/Link Name With Spaces",, ,

подставив mklink Targetпараметр с

,, ,..\"Target Name With Spaces"

или же

,, ,"..\Target Name With Spaces"

создаст успешно сцепленную относительную цель filepath в ссылке, сгенерированной в

C:/test foldEr/Link Name With Spaces

и заканчивая

mklink /D "C:/Test Folder/Test Folder 2/Link Name With Spaces",, ,

с

,, ,"..\..\Target Name With Spaces"

или же

,, ,..\..\"Target Name With Spaces"

создаст ссылку на

C:/Test Folder/Test Folder 2/Link Name With Spaces,

Во всех четырех случаях конечным результатом является символьная ссылка на каталог, которая указывает на каталог

C:/TaRget nAme WitH SpacEs,

но который будет указывать на другое местоположение полностью, если какая-либо из сгенерированных ссылок когда-либо будет перемещена в другой каталог либо с помощью команды, например, robocopyлибо с помощью приложения, которое аналогичным образом учитывает символические ссылки.

Это на самом деле неправильно. На самом деле, единственное, что вам нужно сделать, это использовать обратную косую черту вместо обычной косой черты. Использование `" .. \ что-то другое "` просто отлично работает. Seth 6 лет назад 0
@ Seth, Ваш первоначальный ответ на мой вопрос был неверным. `mkdir C: \ temp \ example \ a mkdir C: \ temp \ example \ b \ c mklink / DC: \ temp \ example \ a \ redirection .. \ b` при обратном слэше НЕ содержит кавычек. Кавычки НЕОБХОДИМЫ, если путь к файлу содержит пробелы. Однако очевидно, что, поскольку мой сценарий работал точно так же, как и ваш, в ЭТОМ конкретном потоке комментариев, не имеет особого значения, где они используются, если они содержат пробелы между ними. Stephen Hanson 6 лет назад 0
Нет необходимости просто цитировать каталог, в котором есть пробелы. Сделайте вашу жизнь проще, просто цитируя все это. На это я и указываю. В вашем первоначальном комментарии говорилось, что вам нужно использовать без кавычек `..`, что неправильно. Вы, вероятно, исправили это в своем редактировании. Seth 6 лет назад 0
@ Я так и сделал, но мое утверждение должно было показать, что кавычки необходимы из-за включения пробельных символов. Stephen Hanson 6 лет назад 0