57

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

5 ответов5

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

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

24

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

1

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

echo ../poo >/file/name

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

ln -s ../poo /file/name

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

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

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
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  

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .