Створіть символічне посилання відносно поточного каталогу


110

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

Це добре працює, коли я його вказую так:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Однак, коли я намагаюся, це створює несправне посилання:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Це створює посилання, в яке я не можу cd.

Коли я намагаюся, Баш скаржиться:

bash: cd: Data: Too many levels of symbolic links

Символічне посилання Дані в моєму домі також забарвлюється червоним кольором, коли lsвстановлено відображення кольорового виводу.

Чому це відбувається? Як я можу створити посилання таким чином? (Я хочу створити символьне посилання на каталог в моєму робочому каталозі в іншому каталозі.)


Редагувати: відповідно до цієї відповіді StackOverflow, якщо другий аргумент (у моєму випадку це ~ / Data) вже існує та є каталогом, lnстворить символьне посилання на ціль всередині цього каталогу.

Однак у мене виникає та ж проблема з:

ln -s Data/ ~/

7
Просто випадкова порада: cd ~зазвичай те саме, що cd.

3
ls -l ~/Dataдопомогли б вам побачити, що сталося не так із "червоним" посиланням.
msw

Гм, не знав, що я можу це зробити, дякую. Я пам’ятаю, що намагався catце зробити, але я забув, що було результатом ... (я в даний момент не вдома.)
jcora

Бічна примітка, припустимо, ви хочете створити лише посилання всіх файлів, dir та subdir всередині певної папки, скажімо, для всіх елементів всередині, /run/media/name/exhdd/Data/щоб Dataпотім використовувати наступнеln -s /run/media/name/exhdd/Data/* Data
user2555595

Відповіді:


115

Ось що відбувається. Якщо ви зробите симпосилання з відносним шляхом, симпосилання буде відносною. Символьні посилання просто зберігають шляхи, які ви їм надаєте. Вони ніколи не вирішують шляхи до повних шляхів. Біг

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

створює символічне посилання з ім'ям ls2в /usr/binдо ls( а саме. /usr/bin/ls) по відношенню до каталогу , в якому символічний знаходиться в ( /usr/bin). Наведена вище команда створила б функціональне посилання з будь-якого каталогу.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Якщо ви перенесли симпосилання в інший каталог, він перестане вказувати на файл /usr/bin/ls.

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

ln -s "$(realpath Data)" ~/Data

14

У мене була така ж проблема. Google привів до цієї відповіді, але найпростіше рішення тут не зафіксовано:

ln -sT 

-T робить трюк

людина ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Просто додайте це сюди, щоб хтось із тим самим питанням міг знайти це :)


9

lnПоведінка людини щодо відносних шляхів неінтуїтивна. Для відновлення розуму використовуйте -rпрапор.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Пояснення:

   -r, --relative
          create symbolic links relative to link location

Це означає, що lnбуде робити те, що ви очікуєте. Він врахує, в якому каталозі ви перебуваєте, в якому каталозі знаходиться ціль, і побудує шлях відносно каталогу, в якому буде посилання. Поведінка за замовчуванням (без -r) полягає в інтерпретації першого параметра (цілі) буквально , в у такому випадку ви повинні побудувати шлях самостійно, щоб він був дійсним у каталозі посилання.

Крім того, використовуйте абсолютний шлях, як згадував @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

або

ln -s "(realpath Data)" ~/Data #fish shell

-1

Дуже просто ви можете створити посилання для папки. Подивіться мою команду

ln -s / home / targated folder / var / www / html / link_name

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