Crie um link simbólico relativo ao diretório atual

103

Estou tentando criar um link simbólico no meu diretório pessoal que aponta para um diretório no meu disco rígido externo.

Funciona bem quando eu especifico assim:

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

No entanto, cria um link defeituoso quando tento isto:

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

Isso cria um link para o qual não posso cd .

Quando tento, o bash reclama:

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

O link simbólico de dados em minha casa também é colorido em vermelho quando ls está definido para exibir a saída colorida.

Por que isso está acontecendo? Como posso criar um link dessa maneira? (Eu quero criar um link simbólico para um diretório no meu diretório de trabalho em outro diretório.)

Editar: de acordo com esta resposta do StackOverflow, se o segundo argumento (no meu caso, seria ~ / Data) já existe e é um diretório, ln irá criar um symlink para o destino dentro desse diretório.

No entanto, estou com o mesmo problema:

ln -s Data/ ~/
    
por jcora 24.07.2013 / 00:35

4 respostas

111

Veja o que está acontecendo. Se você fizer um symlink com um caminho relativo, o link simbólico será relativo. Os links simbólicos apenas armazenam os caminhos que você fornece a eles. Eles nunca resolvem caminhos para caminhos completos. Correndo

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

cria um link simbólico chamado ls2 em /usr/bin a ls (viz. /usr/bin/ls ) relativo ao diretório em que o link simbólico está ( /usr/bin ). O comando acima criaria um symlink funcional de qualquer diretório.

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

Se você mover o link simbólico para um diretório diferente, ele deixará de apontar para o arquivo em /usr/bin/ls .

Você está criando um link simbólico que aponta para Data e o nomeia Data . Está apontando para si mesmo. Você tem que fazer um symlink com o caminho absoluto do diretório.

ln -s "$(realpath Data)" ~/Data
    
por 24.07.2013 / 00:54
11

Eu estava tendo o mesmo problema. O Google levou a essa resposta, mas a solução mais simples não está documentada aqui:

ln -sT 

-T faz o truque

man ln:

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

Basta adicionar isso aqui para que qualquer pessoa com a mesma pergunta possa encontrar isto:)

    
por 01.11.2016 / 13:11
3
O comportamento de

ln com caminhos relativos não é intuitivo. Para restaurar a sanidade, use o sinalizador -r .

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

Explicação:

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

O que isso significa é que ln fará o que você espera. Ele levará em conta em qual diretório você está, em qual diretório o destino está e construirá um caminho relativo ao diretório no qual o link estará. O comportamento padrão (sem -r ) é interpretar o primeiro parâmetro (destino) literalmente , caso em que você tem que construir o caminho você mesmo para que seja válido no diretório do link.

Como alternativa, use um caminho absoluto, como mencionado por @SmithJohn

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

ou

ln -s "(realpath Data)" ~/Data #fish shell
    
por 02.05.2018 / 16:05
-1

É muito simples criar um link para uma pasta. Olha meu comando

ln -s / home / pastapasta / var / www / html / link_name

    
por 03.11.2017 / 15:38