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

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/ ~/
jcora
источник
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 

-Т делает трюк

man ln:

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

Просто добавьте это здесь, так что любой с таким же вопросом может найти это :)

Tiegs
источник
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 / targatedfolder / var / www / html / link_name

Бхупендра Саху
источник