Як створити відносне символічне посилання в Linux?


62

Мені потрібна символьна посилання, яка розв’язується відносно каталогу, в який вона розміщена. Яка команда використовується для створення такої речі?

Відповіді:


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

Вказаний шлях зберігається разом із файлом. Коли ви отримуєте доступ до файлу, збережений шлях переглядається та розширюється відносно файлу. Невідомо, в якому каталозі ви знаходилися, коли ви створювали посилання.


23
Ні, ти цього не робиш. Вам просто потрібно переконатися, що ви вказали розташування відносно імені посилання замість поточного каталогу.
Ігнасіо Васкес-Абрамс

5
Щоб допомогти зрозуміти: шлях, який ви надаєте, зберігається з файлом. Коли ви отримуєте доступ до файлу, збережений шлях переглядається та розширюється відносно файлу. Невідомо, в якому каталозі ви знаходилися, коли ви створювали посилання.
Маріан

2
точно еквівалент:ln -s ../some/other/file /some/dir/linkname
sehe

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
Дякую. Цей -rпараметр корисний, коли ви перехрещуєте компіляцію та потребуєте абсолютних шляхів на хості збірки, але відносних шляхів до цілі.
Роберт Калхун

rdfind може створювати по-справжньому погані символьні посилання, які є не тільки абсолютними, але й відкликають каталоги без жодної причини. ln -r -s targetfile myaliasможе допомогти вам виправити це
Рей Фосс

2

Що вам потрібно зрозуміти, це в основному те, що символьне посилання більше нагадує текстовий файл, ніж як запис у каталозі, який містить файл. Тож якщо ти

echo ../poo >/file/name

то це досить схоже на

ln -s ../poo /file/name

Системі байдуже, чи /file/../pooвзагалі існує, це лише фрагмент тексту, який потрапляє в симпосилання. Коли щось намагається відкрити симпосилання, тоді система намагається її вирішити.

Якщо ви використовуєте оболонку із завершенням імені файлу, ця функція може сплутати речі, дозволяючи вам заповнити ім’я файлу відносно вашого поточного робочого каталогу, навіть якщо ви в кінцевому підсумку використовуватимете його як ціль символьного посилання у зовсім іншому каталозі.


Це зловживають деякі системні виклики - Я знаю , наприклад , BSD використовується , щоб дозволити вам симлінк конкретного системного файлу , щоб <змінити те, як систему розподіленої пам'ять. Звичайно, <в цьому каталозі не знайдено жодного файлу , це просто дешевий спосіб створення дуже маленької речі, схожої на файл, яка має деякі привабливі властивості над звичайним текстовим файлом на цій конкретній платформі.
трійчатка

Це посилання тепер мертве. Спробуйте 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  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.