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

110

Estou tentando criar um link simbólico no meu diretório pessoal que aponte 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, ele cria um link com defeito quando tento isso:

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

Isso cria um link que não consigo cdacessar.

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 lsestá definido para exibir a saída colorida.

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


Edit: de acordo com esta resposta StackOverflow, se o segundo argumento (no meu caso, seria ~ / Data) já existir e for um diretório, lncriará um link simbólico para o destino dentro desse diretório.

No entanto, estou enfrentando o mesmo problema com:

ln -s Data/ ~/
jcora
fonte
7
Apenas uma dica aleatória: cd ~geralmente é o mesmo que cd.
3
ls -l ~/Dataajudaria você a ver o que havia de errado com o link "vermelho".
msw
Hum, não sabia que eu poderia fazer isso, obrigado. Lembro-me de tentar catisso, mas eu esqueci qual foi o resultado ... (eu não estou em casa para elas momento.)
jcora
Nota lateral, suponha que você queira criar apenas um link simbólico de todos os arquivos, dir e subdir dentro de uma pasta específica, por exemplo, todos os itens dentro /run/media/name/exhdd/Data/para Data, em seguida, use o seguinteln -s /run/media/name/exhdd/Data/* Data
user2555595

Respostas:

115

Aqui está o que está acontecendo. Se você criar um link simbólico 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. Corrida

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

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

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

Se você moveu a ligação simbólica para um diretório diferente, deixaria de apontar para o arquivo no /usr/bin/ls.

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

ln -s "$(realpath Data)" ~/Data
Ujjwal Singh
fonte
14

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

homem em:

-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 isso :)

tiegs
fonte
9

lnO comportamento de caminhos relativos não é intuitivo. Para restaurar a sanidade, use a -rbandeira.

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 lnfará 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 em que o link estará. O comportamento padrão (sem -r) é interpretar o primeiro parâmetro (destino) literalmente , em Nesse caso, você deve construir o caminho sozinho 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
Aleksandr Dubinsky
fonte
-1

Muito simplesmente, você pode criar um link para uma pasta. Olha meu comando

ln -s / home / pasta targated / var / www / html / link_name

Bhupendra Sahu
fonte