Как создать относительную символическую ссылку в Linux?

62

Мне нужна символическая ссылка, которая разрешается относительно каталога, в котором она находится. Какая команда используется для создания такой вещи?

Иеремия Роуз
источник

Ответы:

78
  1. Перейдите в каталог, в котором вы хотите разместить ссылку
  2. Запустите команду ln -s ../some/other/file linkname

Указанный вами путь сохраняется вместе с файлом. При доступе к файлу сохраненный путь ищется и раскрывается относительно файла. Он не знает, в каком каталоге вы были, когда создавали ссылку.

Иеремия Роуз
источник
23
Нет, ты не Вам просто нужно убедиться, что вы указали расположение относительно имени ссылки вместо вашего текущего каталога.
Игнасио Васкес-Абрамс
5
Чтобы помочь в понимании: указанный вами путь сохраняется вместе с файлом. При доступе к файлу сохраненный путь ищется и раскрывается относительно файла. Он не знает, в каком каталоге вы были, когда создавали ссылку.
Мариан
2
точно эквивалентно:ln -s ../some/other/file /some/dir/linkname
сехе
1
Вместо того, чтобы идти вниз по каталогу и снова вверх, вы также можете просто сделать это, ln -s ./file linknameпоскольку .ссылается на текущий каталог.
pduersteler
1
ln -s somedir/original-dir link-nameне работает. Он создает каталог с именем link-name, содержащим недопустимую ссылку. Команда, которая работает этоln -sr somedir/original-dir link-name
Лоренц Мейер
28

Недавние версии GNU coreutils 'ln (> = 8.16) поддерживают опцию --relative(или -r), которая означает, что вы можете вызывать ln -sс 2 абсолютными или относительными (по отношению к вашему рабочему каталогу) путями, и она определит правильный относительный путь, который должен быть написано в символическую ссылку.

Грусть Ветра
источник
2
Благодарю. Эта -rопция полезна, когда вы выполняете кросс-компиляцию и вам нужны абсолютные пути на хосте сборки, но относительные пути на цели.
Роберт Кэлхун
rdfind может создавать некоторые действительно плохие символические ссылки, которые не только абсолютны, но и возвращают каталоги без причины. ln -r -s targetfile myaliasможет помочь вам это исправить
Рэй Фосс
2

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

echo ../poo >/file/name

то это очень похоже на

ln -s ../poo /file/name

Система не заботится, /file/../pooсуществует ли она вообще, это всего лишь фрагмент текста, который помещается в символическую ссылку. Когда что-то пытается открыть символическую ссылку, тогда система пытается разрешить это.

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

tripleee
источник
Это злоупотребляют некоторые системные вызовы - Я знаю , например , BSD используется , чтобы позволить вам симлинку конкретного системный файла для <изменения как система распределенной памяти. Конечно, <в этом каталоге нет файла с именем , это просто дешевый способ создания очень маленькой файловой вещи, которая обладает некоторыми привлекательными свойствами по сравнению с обычным текстовым файлом на этой конкретной платформе.
tripleee
Эта ссылка сейчас мертва. Попробуйте man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5, но обратите внимание, что поведение в более поздних версиях OpenBSD намного менее ... красочно.
Трипли
0

Относительные ссылки были сложными для меня на OS X, то есть

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

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

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Коди Хесс
источник
Это жизнеспособное решение, поэтому не нужно комментировать. Это может остаться в качестве отдельного ответа.
Slhck
1
Ваша первоначальная попытка с относительными ссылками просто неверна, и поэтому она не работает. Вы неправильно поняли, как работают относительные ссылки. В этом нет ничего особенно сложного (даже если вы используете OS X). Возможно, вы ошиблись из-за того, что другие ответы говорили о том, как изменить свой рабочий каталог при создании ссылки. Это просто для того, чтобы упростить правильную ссылку, и в этом нет необходимости. Вы определяете не относительный путь относительно текущего каталога, а каталог ссылки. Это то, что вы были после:ln -s Dropbox/git/codyhess/bin ~/bin
Тимо
Также @slhck, когда кто-то конкретно спрашивает, как создать относительные ссылки, в каком мире высказывание о том, что вы можете создавать абсолютные ссылки, представляет собой «жизнеспособное решение»? В частности, он не отвечает на вопрос ОП и, следовательно, является полной противоположностью решения, это не решение. Это не должен быть ни комментарий, ни ответ, это должен быть вопрос «Как именно работают относительные ссылки (объяснено, чтобы пользователи Mac понимали это)?». Я надеюсь, что этот пользователь Mac теперь объяснил это достаточно хорошо. :)
Тимо
@TimoLehto Возможно, вы хотите отправить комментарий оригинальному автору (Коди Хесс). Я только отредактировал пост.
slhck
@slhck, я направил его вам, потому что вы сочли решение «жизнеспособным», и ваш комментарий заставил меня подумать, что вы будете тем человеком, который сможет убедить, если вы захотите пометить ответ как «не ответ» (и получить пометка принята).
Тимо
0

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

Как упоминал Игнасио Васкес-Абрамс в комментариях, вы должны указать расположение файла / папки относительно того, где будет создана символическая ссылка, а не относительно вашего текущего каталога.

ПРИМЕР

Вы находитесь /usr/share/nginx/html/_src/learn Вы создадите символическую ссылку codingв/usr/share/nginx/html

Создать относительную символическую ссылку (теория):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Создать фактическую относительную символическую ссылку:

sudo ln -s ./_src/learn/coding ../../coding

Больше информации (тот же пример)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
Стараться
источник