В чем разница между символической ссылкой и ярлыком?

Ответы:

57

Я думаю, что важным моментом является то, что ярлыки - это просто файл. У них есть размер (маленький, который просто указывает, куда они указывают), и они требуют, чтобы приложение поддерживало этот тип файла для использования.

Символическая ссылка - это уровень файловой системы, и все видят ее как исходный файл. Приложение не нуждается в специальной поддержке для использования символической ссылки.

Phoshi
источник
6
Дерево ходьба команда (все как утилиты UNIX find, tar, duи т.д.) действительно нужно знать о символических ссылках или они могут сделать некоторые очень глупые вещи. Например, ослепление следующих символических ссылок может создать циклы в файловой системе, и это плохо .
dmckee
9
@dmckee; Очень хороший момент, хотя ни одному приложению не нужна особая поддержка, чтобы им следовать, им нужна особая поддержка, чтобы не следовать за ними!
Фоши
Да, для их использования не требуется поддержка, но нужно знать о них.
dmckee
@Phoshi Что именно вы подразумеваете под «и им требуется приложение для поддержки этого типа файлов для использования». Можете ли вы объяснить с примером?
Компьютерщик
7
@ Geek: «ярлык» - это файл, который содержит путь к файлу другого файла. Когда вы читаете его, вы читаете специально отформатированный файл, который говорит вам, где искать дальше. Если ваше приложение не слушает, а просто читает файл дословно, то вы не следуете ему. Символическая ссылка находится на уровне файловой системы, сама файловая система содержит «истинный» путь к данным, и когда вы пытаетесь получить к ним доступ, вы извлекаете данные, на которые указывает.
Phoshi 12.12.12
20

«Символическая ссылка» может фактически действовать как замена каталога или файла функциональным способом и обычно используется в средах Unix / Linux. Хотя в Windows это явно поддерживается, я пока не видел его реального использования.

«Ярлык» - это обычный файл, который содержит ссылку на файл или каталог назначения, а также некоторые другие вещи, например, отображаемый значок. В отличие от символической ссылки, вы не можете «cd ./shortcut-name» в DOS (в Unix / Linux вы можете «cd ./symlink-name», и он будет работать как настоящий подкаталог).

Кроме того, в большинстве приложений Windows, когда вы нажимаете на ярлык в любом диалоге File-> Open GUI, поле вашего имени файла заполняется именем этого ярлыка, а также действует как подкаталог, в то время как в Unix / Linux GUI обрабатывает Символьная ссылка как путь (без изменения поля имени файла).

Рэндольф Ричардсон
источник
В Unix / Linux также существуют «жесткие ссылки», которые применяются только к файлам (но не к каталогам). Это естественные записи имени файла в файловой системе, которые просто указывают на те же данные файла, что и другая запись имени файла в другом месте (не обязательно должны находиться в том же каталоге).
Рэндольф Ричардсон
4
@Randolf: 1) Жесткие ссылки существуют и в Windows. 2) Одной из функций ярлыков оболочки является автоматическое отслеживание цели - если цель перемещается, большинство ярлыков времени продолжит работать. (В домене AD даже можно отслеживать файлы на компьютерах; например, если вы перемещаете HD в другое место.) 3) Одно из применений символических ссылок - перенаправление файла или каталога в другое место - они могут указывать на файлы (в отличие от соединений ) и каталоги (в отличие от жестких ссылок), кросс-файловые системы (в отличие от жестких ссылок) и, AFAIK, могут даже указывать на сетевые расположения.
grawity
Поздний комментарий, и я не уверен, что я просто не знаю, что я делаю с ярлыками, но мне пришлось создать символическую ссылку вместо ярлыка для моего файла vimrc (я ссылаюсь на проект dotfiles, который я использую в отдельный каталог).
Making3
11

Как уже упоминалось, символическая ссылка является одним из видов ссылок, доступных на уровне файловой системы, что делает ее прозрачной для приложений. Я нашел эту документацию очень полезной (особенно в разделе «Обрезать / развернуть / соединить внешние соединения / символические ссылки»). И инструмент там тоже выглядит красиво. (Упомянув это и mklink, мы надеемся, что дальнейшие поиски найдут это обсуждение.)

Ярлык - это файл, а не реальная ссылка, и, как правило, он успешно используется в качестве ссылки только при интерпретации пользовательским интерфейсом Windows. Например, если дважды щелкнуть ярлык папки, Windows перенаправит вас в другое место. (Это включает в себя общие диалоговые окна «Открыть файл» и «Сохранить файл», которые запускаются большинством приложений.) На моем рабочем столе есть ярлык для этой папки: C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ G

Сокращенное имя файла: C: \ Users \ user5 \ Desktop \ Games.lnk, хотя Windows подавляет расширение .lnk и просто показывает «Игры», даже если вы снимите флажок «скрыть расширения для известных типов файлов». Но если вы откроете командную строку и выполните команду dir, вы увидите это:

C:\Users\user5\Desktop>dir "g*"
 Volume in drive C has no label.
 Volume Serial Number is 900...
 Directory of C:\Users\user5\Desktop
03/08/2014  05:30 PM             1,710 Games.lnk
               1 File(s)          1,710 bytes
               0 Dir(s)  246,818,222,080 bytes free

Я могу создать эквивалент с символической ссылкой, используя опцию \ D (для каталога):

C:\Users\user5\Desktop>mklink /D mysymlink  "C:\ProgramData\Microsoft\Windows\S
tart Menu\Programs\G"
symbolic link created for mysymlink <<===>> C:\ProgramData\Microsoft\Windows\Sta
rt Menu\Programs\G

C:\Users\user5\Desktop>cd mysymlink

C:\Users\user5\Desktop\mysymlink>

(Соединение каталогов (\ J) также является опцией, так как это ссылка на папку.) Проводник Windows, так же как эта консоль и большинство приложений, позволит вам просматривать «вниз» в этом кажущемся подкаталоге, а не (а) перенаправлять «через» в другое место или (б) не удается.

Ярлыки не ведут себя как подкаталоги. Я могу вызвать поведение файла интерфейса пользователя по умолчанию в Windows с помощью этой команды (в Windows Explorer открывается папка «G»):

C:\Users\user5\Desktop>"Games.lnk"

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

C:\Users\user5\Desktop>dir "my*"
 Volume in drive C has no label.
 Volume Serial Number is 900...

 Directory of C:\Users\user5\Desktop

03/29/2014  06:08 PM    <DIR>          mysubdir
03/29/2014  05:40 PM    <SYMLINKD>     mysymlink [C:\ProgramData\Microsoft\Windo
ws\Start Menu\Programs\G]
               0 File(s)              0 bytes
               2 Dir(s)  246,816,153,600 bytes free

C:\Users\user57\Desktop>mysubdir
'mysubdir' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\user57\Desktop>mysymlink
'mysymlink' is not recognized as an internal or external command,
operable program or batch file.

И наоборот, вы не можете изменить каталог на ярлык:

C:\Users\user5\Desktop>cd "Games.lnk"
The directory name is invalid.

Пользовательский интерфейс Windows позволяет щелкнуть правой кнопкой мыши, чтобы изменить свойства ярлыка. Или следующее показывает, что именно хранится в файле .lnk (двоичные данные), хотя лучше будет отображать шестнадцатеричный редактор:

C:\Users\user5\Desktop>notepad.exe "Games.lnk"

В то время как при попытке запустить Блокнот в фактической подпапке появляется сообщение об ошибке «Отказано в доступе» и пустой Блокнот.

И наоборот, если я создаю символическую ссылку на файл (не символическую ссылку на папку), я могу запустить ее с помощью Блокнота. Из следующих вызовов notepad.exe первые два работают, а третий завершается неудачно (он открывает файл .LNK, двоичный файл gobbledegook).

C:\Users\user5\Desktop>mklink symplain.txt plain.txt
symbolic link created for symplain.txt <<===>> plain.txt

C:\Users\user5\Desktop>notepad.exe "symplain.txt"

C:\Users\user5\Desktop>notepad.exe "plain.txt"

C:\Users\user5\Desktop>notepad.exe "plain.txt.lnk"

Это не просто консоль. Копирование ярлыка в Блокнот на мой рабочий стол и попытка перетаскивания на него каждого из трех элементов демонстрирует точно такое же поведение. (Поскольку перетаскивание, в отличие от двойного щелчка, позволяет приложению интерпретировать ярлык.)

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

«Основное различие в том, как Windows разрешает символические ссылки и соединения каталогов, заключается в том, где происходит обработка. Windows обрабатывает символические ссылки в локальной системе, даже когда они ссылаются на местоположение на удаленном файловом сервере. Windows обрабатывает соединения каталогов, которые ссылаются на удаленные файловый сервер на самом сервере. Символьные ссылки на сервере могут поэтому ссылаться на местоположения, которые доступны только от клиента, как другие тома клиента, в то время как соединения каталогов не могут. Для решения этой проблемы Windows Vista поддерживает новый тип символической ссылки для обоих файлов. и каталоги.

«Многие команды файловой системы были обновлены, чтобы понять значение символических ссылок. Например, команда« Удалить »знает, что не следует переходить по ссылкам, что приведет к удалению цели, а вместо этого удалить ссылку. Однако, поскольку не все приложения может обрабатывать символические ссылки правильно, для создания символической ссылки требуется новая привилегия «Создать символическую ссылку», которую по умолчанию имеют только администраторы ».

Джон Кумбс
источник
2

«Символьные ссылки отличаются от ярлыков тем, что они предлагают прозрачный * путь к нужному объекту данных, с ярлыком (.lnk), что-то должно прочитать и интерпретировать содержимое файла ярлыка, а затем открыть файл, на который он ссылается (т. Е. это двухэтапный процесс.) Когда приложение использует символическую ссылку, оно получает немедленный доступ к объекту данных, на который ссылается символическая ссылка (т.е. это одношаговый процесс). "

Источник: http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html

ariefcfa
источник
0

Иногда полезно иметь функциональный пример, поэтому плохо объясню, как я использую эту функцию.

Я использую Google Drive для резервного копирования файлов, но иногда я хочу создавать резервные копии файлов в определенной папке (я не могу переместить их на ../google диск). Особенно с универсальными приложениями Windows 10, файлы конфигурации и тому подобное хранятся в appdata, и большую часть времени я не могу изменить это местоположение.

Я использую родное приложение Windows stikynot, и я хотел сделать резервную копию своих заметок, поэтому я использовал символическую ссылку здесь. Диск Google распознает ссылку как фактический файл и синхронизирует файлы очень хорошо, в то время как фактический файл все еще находится в папке appdata.

Когда у меня есть локальные файлы, например папки проекта, которые я не хочу синхронизировать с облаком, я использую ярлыки (копирование, вставка-> вставка ярлыка).

sommmen
источник