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
Eu quero criar um link simbólico simples para um arquivo.
Funciona perfeitamente se eu executar o comando dentro do diretório onde quero que o symlink seja criado:
/path/to/link $ ln -s /path/to/file .
Mas se eu estiver em qualquer outro diretório, ele criará um link corrompido todas as vezes:
/any/other/path $ ln -s /path/to/file /path/to/link
Será que o ln -s
exige que você esteja em um determinado diretório ou está faltando alguma coisa? Executando o Ubuntu 10.04.
Atualização: Desculpe pela confusão sobre se os caminhos eram relativos ou absolutos. Eles eram relativos e, como vários mencionaram em suas respostas, essa foi a fonte do meu problema. Obrigado!
Eu costumo usar
ln -s $(pwd)/local_file /path/to/link
quando preciso vincular um arquivo local.
Isso é sempre intencional para mim. Eu tenho o hábito de fazer:
ln -s $(readlink -f /path/to/file) /path/to/link
que deve funcionar, mas com o custo de torná-lo não relativo no link real do disco.
Não, não existe esse requisito:
aix@aix:/tmp$ cd /tmp
aix@aix:/tmp$ mkdir test_path
aix@aix:/tmp$ echo test > test_path/file.txt
aix@aix:/tmp$ ln -s /tmp/test_path/file.txt /tmp/test_path/link.txt
aix@aix:/tmp$ cat /tmp/test_path/link.txt
test
Verifique se você não digitou os caminhos incorretamente e se está usando caminhos absolutos em todos os lugares (como seu exemplo indica).
Não é realmente sobre qual diretório você está, por si só. É sobre o symlink que você faz: 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 iniciem com o caractere /
ou links simbólicos que não iniciem com esse caractere. Você pode criar links simbólicos que contenham ..
path components e links simbólicos que não contêm. 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 symlink. Então você só precisa ter certeza de que o link simbólico tem o caminho que você deseja.
Aqui está uma maneira semelhante à resposta de Matthew Flaschen, mas aqui está um link simbólico relativo :
/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
Não há dúvida de que isso poderia ser feito em shell Bourne / bash puro, mas é fácil escrever (e ler) isso corretamente em python.
Tags symbolic-link linux unix ln