Слишком много уровней символических ссылок

100

Я создал эту файловую структуру:

test/src
test/firefox

Когда я запускаю эту команду:

ln -s test/src test/firefox

Я ожидаю, что будет создана символическая ссылка test/firefox/src, указывающая на test/src, но вместо этого я получаю эту ошибку:

-bash: cd: src: Too many levels of symbolic links
  • Что я делаю неправильно?
  • Разве вы не можете создать символическую ссылку на одну папку, которая хранится в одной папке?
  • какой в ​​этом смысл?
Давид Зоричта
источник
Я не уверен, что следую тому, что ты сделал. Пожалуйста, опубликуйте выходные данные ls -ld test test/*или точную последовательность команд, которые вы выполнили для создания этих файлов.
Жиль
тест mkdir; тест mkdir / src; тест mkdir / firefox; ln -s test / src test / firefox
David Zorychta
С помощью этих команд, cd test/firefox/srcбудет отображаться ошибка cd: no such file or directory: test/firefox/src, потому что test/firefox/srcэто повисшая символическая ссылка. Вы работаете cdпо какой-то другой символической ссылке src?
Жиль
Я уверен, что вы сделали что-то между ln -sи тем, cdчто вы не говорите нам. Предполагая, что testв вашем текущем каталоге есть только подкаталог, a cd src(или все, что вы выполняли) должно выдать ошибку. Вы положили что-то в test/firefox?
Дабу
5
И как @Gilles намекнул, эта ссылка не будет делать то, что вы думаете, что она делает. Символические ссылки с относительными целями всегда относятся к каталогу символических ссылок , а не к каталогу, из которого вы создали ссылку. Таким образом, находясь в каталоге /some/path, a ln -s test/src test/firefoxсоздаст символическую ссылку, указывающую /some/path/test/firefox/srcна /some/path/test/firefox/test/src, а не на /some/path/test/src.
Дубу

Ответы:

32

На первый взгляд, то, что вы предлагали попробовать, работает для меня.

пример

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Сделайте символическую ссылку:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

Запуск его во второй раз обычно приводит к следующему:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Так что, вероятно, здесь происходит что-то еще. Я подозреваю, что у вас есть круговая ссылка, где ссылка указывает на себя.

Вы можете использовать это, findчтобы вывести это из себя:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
SLM
источник
2
find -L ./ -mindepth 15раскрыл виновника
user7610
168

Как отмечает Дубу в комментарии, проблема заключается в ваших относительных путях. У меня была похожая проблема с символической ссылкой моей конфигурации nginx из /usr/local/etc/nginxв /etc/nginx. Если вы создадите свою символическую ссылку, как это:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

Фактически вы создадите ссылку / etc / nginx -> / etc / nginx, потому что исходный путь относительно пути ссылки. Решение так же просто, как использование абсолютных путей:

ln -s /usr/local/etc/nginx /etc/nginx
Стин Шютт
источник
58
Этот ответ был яснее, чем другой. «Используйте абсолютные пути».
wulftone
1
Я могу подтвердить, что это работает для меня на Windows, используя cygwin. Спасибо!
dimiguel
У меня часто возникают проблемы с получением правильных аргументов. В OSX и GNU Linux они поменялись местами, что смущает меня еще больше.
Даниэль В.
Я до сих пор не могу поверить, что это работает.
PNDA
5
Вы можете использовать относительные ссылки , но они должны основываться на каталоге, где находится символическая ссылка . Другими словами: первый аргумент должен быть таким же, как послеcd того, как вы захотите перейти в целевой каталог из каталога, в котором находится файл символической ссылки.
Тотимедли
9

Символьные ссылки относятся к родительскому каталогу ссылки, а не к текущему каталогу lnпроцесса.

Когда вы делаете:

cd /top/dir
ln -s test/src test/firefox

(где test/firefoxнаходится каталог), вы делаете test/firefox/srcсимволическую ссылку, целью которой является test/src.

Это test/srcотносительно test/firefoxкаталога, так что это символическая ссылка на /top/dir/test/firefox/test/src.

Если вы хотите, чтобы эта символическая ссылка была ссылкой /top/dir/test/src, вам нужно написать:

ln -s ../src test/firefox/

Или же

ln -s /top/dir/test/src test/firefox/

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

С помощью GNU lnвы можете использовать его -rопцию, чтобы он мог самостоятельно выполнять вычисления:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
Стефан Шазелас
источник
5

Используйте абсолютный путь вместо относительного пути, тогда он будет работать.

Например:

ln -s /home/user/test/src /home/user/test/firefox
ДЖИШНУ ТУ
источник
0

Ответ заключается в использовании абсолютного пути. Но может быть неприятно вводить полный путь для чего-то, что находится в текущем каталоге. Вы можете использовать команду подстановки pwd, чтобы избежать этого. Если ваша цель находится в текущем каталоге:

ln -s "$(pwd)"/target abs/path/to/link 

Если ваша ссылка должна быть в текущем каталоге:

ln -s /abs/path/to/target "$(pwd)"
breadnbeer
источник