Занадто багато рівнів символічних посилань


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 test / 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у вашому поточному каталозі є лише підкаталог, 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

2
find -L ./ -mindepth 15виявив винуватця
користувач7610

167

Як в коментарі зазначає Дубу, питання лежить у ваших відносних шляхах. У мене була аналогічна проблема символічних посилань мою конфігурацію 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

57
Ця відповідь була чіткішою, ніж інша. "Використовуйте абсолютні шляхи."
wulftone

1
Я можу підтвердити, що це працювало для мене на Windows cygwin. Дякую!
dimiguel

У мене часто виникають проблеми з виправданням аргументів. У OSX та GNU Linux вони перетворені, що мене ще більше бентежить.
Даніель В.

Я досі не можу повірити, що це працює.
ПНДА

5
Можна використовувати відносні посилання , але вони повинні базуватися на каталозі, де знаходиться символічне посилання . Іншими словами: перший аргумент повинен бути тим самим, який ви писали б після,cd якщо ви хочете перейти до цільового каталогу з каталогу, де знаходиться файл символічного посилання.
totymedli

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