ln -s exige que você esteja em um determinado diretório?

ln -s exige que você esteja em um determinado diretório?

Quero criar um link simbólico simples para um arquivo.

Funciona perfeitamente se eu executar o comando de dentro do diretório onde desejo que o link simbólico seja criado:

/path/to/link $ ln -s /path/to/file .

Mas se eu estiver em qualquer outro diretório, ele sempre criará um link quebrado:

/any/other/path $ ln -s /path/to/file /path/to/link

Exige ln -sque você esteja em um determinado diretório ou estou faltando alguma coisa? Executando o Ubuntu 10.04.

Atualizar:Desculpe pela confusão sobre se os caminhos eram relativos ou absolutos. Eles eram relativos e, como vários mencionaram em suas respostas, essa era a origem do meu problema. Obrigado!

Responder1

Se você não estiver no mesmo diretório do destino, certifique-se de usar o caminho absoluto.

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

Responder2

Eu costumo usar

ln -s $(pwd)/local_file /path/to/link

quando preciso vincular um arquivo local.

Responder3

Isso sempre é pouco intuitivo para mim. Tenho o hábito de fazer:

ln -s $(readlink -f /path/to/file) /path/to/link

que deveria funcionar, mas ao custo de torná-lo não relativo no link real no disco.

Responder4

Não se trata realmente de qual diretório você está. É sobre o link simbólico que você cria: links simbólicos são apenas arquivos que contêm um caminho que aponta para um arquivo. Você pode criar links simbólicos que contenham caminhos que comecem com o /caractere ou links simbólicos que não comecem com esse caractere. Você pode criar links simbólicos que contenham ..componentes de caminho e links simbólicos que não contenham. Quando os programas resolvem links simbólicos para encontrar o arquivo de destino, eles interpretam o caminho como sendo relativo ao diretório que contém o link simbólico. Então você só precisa ter certeza de que o link simbólico tem o caminho desejado.

Aqui está uma maneira semelhante à resposta de Matthew Flaschen, mas aqui fazendo umarelativolink simbólico:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

Sem dúvida, isso também poderia ser feito em shell Bourne/bash puro, mas é fácil escrever (e ler) isso corretamente em python.

informação relacionada