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

3

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!

    
por evanrmurphy 05.02.2012 / 09:17

5 respostas

5

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
    
por 05.02.2012 / 09:19
3

Eu costumo usar

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

quando preciso vincular um arquivo local.

    
por 04.10.2012 / 12:32
1

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.

    
por 05.02.2012 / 09:20
0

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).

    
por 05.02.2012 / 09:20
0

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.

    
por 05.02.2012 / 16:18