Como crio um link simbólico relativo no Linux?

62

Eu preciso de um link simbólico que resolva em relação ao diretório em que ele é colocado. Que comando é usado para criar uma coisa dessas?

Jeremiah Rose
fonte

Respostas:

78
  1. Vá para o diretório em que você deseja residir no link
  2. Execute o comando ln -s ../some/other/file linkname

O caminho que você fornece é armazenado com o arquivo. Quando você acessa o arquivo, o caminho armazenado é pesquisado e expandido em relação ao arquivo. Ele não sabe em que diretório você estava quando criou o link.

Jeremiah Rose
fonte
23
Não, você não. Você apenas precisa certificar-se de especificar o local em relação ao nome do link em vez do diretório atual.
Ignacio Vazquez-Abrams
5
Para ajudar no entendimento: O caminho que você fornece é armazenado com o arquivo. Quando você acessa o arquivo, o caminho armazenado é pesquisado e expandido em relação ao arquivo. Ele não sabe em que diretório você estava quando criou o link.
Marian
2
exatamente equivalente:ln -s ../some/other/file /some/dir/linkname
sehe
11
Em vez de descer um diretório e subir novamente, você também pode fazer isso, ln -s ./file linknamejá que .se refere ao diretório atual.
pduersteler
11
ln -s somedir/original-dir link-namenão funciona. Ele cria um diretório com o nome link-nameque contém um link inválido. O comando que funciona éln -sr somedir/original-dir link-name
Lorenz Meyer
28

As versões recentes do GNU coreutils 'ln (> = 8.16) suportam a opção --relative(or -r), o que significa que você pode chamar ln -scom 2 caminhos absolutos ou relativos (em relação ao seu diretório de trabalho) e ele descobrirá o caminho relativo correto que deve ser gravado no link simbólico.

Bluewind
fonte
2
Obrigado. A -ropção é útil quando você está compilando em cruz e precisa de caminhos absolutos no host de construção, mas de caminhos relativos no destino.
Robert Calhoun
O rdfind pode produzir links simbólicos muito ruins que não são apenas absolutos, mas retornam dos diretórios sem motivo. ln -r -s targetfile myaliaspode ajudá-lo a corrigi-lo
Ray Foss
2

O que você precisa entender é basicamente que um link simbólico é mais um arquivo de texto do que uma entrada de diretório que contém um arquivo. Então, se você

echo ../poo >/file/name

então isso é bem parecido com

ln -s ../poo /file/name

O sistema não se importa se /file/../pooexiste, é apenas um pedaço de texto que é colocado no link simbólico. Quando algo tenta abrir o link simbólico, é quando o sistema tenta resolvê-lo.

Se você estiver usando um shell com preenchimento de nome de arquivo, esse recurso poderá confundir coisas, permitindo que você complete um nome de arquivo relativo ao seu diretório de trabalho atual, mesmo se você acabar usando isso como o destino de um link simbólico em outro diretório.

triplo
fonte
Esta é abusado por algumas chamadas de sistema - Sei por exemplo BSD usado para permitir que você ligar simbolicamente um arquivo de sistema particular para <mudar a forma como o sistema de memória alocada. É claro que não há arquivo nomeado <nesse diretório, é apenas uma maneira barata de criar um arquivo muito pequeno, que possui algumas propriedades atraentes em relação a um arquivo de texto comum nessa plataforma específica.
Tripleee
Esse link agora está morto. Tente man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5, mas observe também que o comportamento nas versões mais recentes do OpenBSD é muito menos ... colorido.
tripleee 7/03
0

Links relativos eram complicados para mim no OS X, ou seja,

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

ambos não funcionaram (algo foi criado, mas não era um diretório). Criei o link desejado usando caminhos absolutos .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Cody Hess
fonte
É uma solução viável, portanto não precisa ser um comentário. Isso pode permanecer como uma resposta separada.
slhck
11
Sua tentativa inicial com links relativos está completamente errada e é por isso que não está funcionando. Você entendeu mal como os links relativos funcionam. Não há nada de particularmente complicado nisso (nem mesmo se você estiver usando o OS X). Talvez você tenha se enganado com as outras respostas falando sobre alterar seu diretório de trabalho ao criar o link. Isso foi feito apenas para facilitar a conexão correta e não é de forma alguma necessário. Você não define o caminho relativo em relação ao seu diretório atual, mas ao diretório do link. Isto é o que você estava procurando:ln -s Dropbox/git/codyhess/bin ~/bin
Timo
Também @slhck quando alguém está perguntando especificamente como criar links relativos em que mundo um ditado de que você pode fazer links absolutos constitui uma "solução viável"? Especificamente, não responde à pergunta dos OPs e, portanto, é exatamente o oposto da solução, não há solução. Isso não deve ser um comentário nem uma resposta, mas uma pergunta "Como exatamente os links relativos funcionam (explicados para que os usuários do Mac os entendam)?". Espero que este usuário do mac tenha explicado bem o suficiente. :)
Timo
@TimoLehto Talvez você queira endereçar o comentário ao autor original (Cody Hess). Eu apenas copiei o post.
slhck 10/05
@slhck, direcionei para você, porque você considerou a solução "viável" e seu comentário me fez pensar que você seria a pessoa a convencer se alguém quisesse sinalizar a resposta como "não uma resposta" (e obter o sinalização aceita).
Timo
0

Eu só queria explicar melhor como criar um link simbólico usando caminhos relativos (com um exemplo detalhado).

Como Ignacio Vazquez-Abrams mencionou nos comentários, você deve especificar o local do arquivo / pasta em relação ao local em que o link simbólico será criado, não em relação ao seu diretório atual.

EXEMPLO

Você está dentro /usr/share/nginx/html/_src/learn Você criará um link simbólico codingno/usr/share/nginx/html

Crie um vínculo simbólico relativo (teoria):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Crie um link simbólico relativo real:

sudo ln -s ./_src/learn/coding ../../coding

Mais informações (mesmo exemplo)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
TryHarder
fonte