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 -s
que 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.