Muitos níveis de links simbólicos

82

Eu criei esta estrutura de arquivos:

test/src
test/firefox

Quando eu executo este comando:

ln -s test/src test/firefox

Espero que um link simbólico test/firefox/src seja criado apontando para test/src , no entanto, recebo este erro:

-bash: cd: src: Too many levels of symbolic links
  • O que estou fazendo de errado?
  • Você não pode criar um link simbólico para uma pasta armazenada em um irmão dessa pasta?
  • Qual é o objetivo disso?
por Macmee 09.07.2014 / 02:28

5 respostas

28

Na superfície, o que você sugeriu que você tentou funciona para mim.

Exemplo

$ mkdir -p test/src test/firefox

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

Faça o link simbólico:

$ 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

Executá-lo pela segunda vez normalmente produziria isso:

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

Então você provavelmente tem outra coisa acontecendo aqui. Eu suspeitaria que você tem uma referência circular onde um link está apontando de volta para si mesmo.

Você pode usar find para descobrir isso um pouco:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
    
por 09.07.2014 / 03:19
135

Como Dubu aponta em um comentário, a questão está em seus caminhos relativos. Eu tive um problema parecido com o symlinking my nginx configuration from /usr/local/etc/nginx to /etc/nginx . Se você criar seu symlink assim:

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

Você, de fato, fará o link / etc / nginx - > / etc / nginx, porque o caminho de origem é relativo ao caminho do link. A solução é tão simples quanto usar caminhos absolutos:

ln -s /usr/local/etc/nginx /etc/nginx
    
por 22.01.2015 / 21:02
6

Os links simbólicos são relativos ao diretório pai do link, não ao diretório atual do processo ln .

Quando você faz:

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

(onde test/firefox é um diretório), você está criando um link simbólico test/firefox/src cujo destino é test/src .

Esse test/src é relativo ao diretório test/firefox , então esse é um link simbólico para /top/dir/test/firefox/test/src .

Se você quiser que esse link simbólico seja um link para /top/dir/test/src , será necessário escrever:

ln -s ../src test/firefox/

Ou

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

embora geralmente seja uma má idéia criar links simbólicos para caminhos absolutos, pois eles são facilmente quebrados quando os diretórios são renomeados ou os sistemas de arquivos são montados em outro lugar.

Com o GNU ln , você pode usar sua opção -r para permitir que ele faça o cálculo sozinho:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
    
por 29.11.2016 / 17:00
1

Use o caminho absoluto em vez do caminho relativo, então ele funcionará.

Por exemplo:

ln -s /home/user/test/src /home/user/test/firefox
    
por 25.05.2018 / 13:51
0

A resposta é usar o caminho absoluto. Mas pode ser irritante digitar o caminho completo para algo que está no diretório atual. Você pode usar a substituição de comando do pwd para evitar isso. Se o seu destino estiver no diretório atual:

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

Se o seu link deve estar no diretório atual:

ln -s /abs/path/to/target "$(pwd)"
    
por 14.09.2018 / 08:04