Cria um symlink no bash com dois caminhos relativos

1

Eu tenho dois diretórios em minha casa: ~/dir1 e ~/dir2 com um arquivo no primeiro: ~/dir1/file.txt Existe alguma maneira de fazer um link simbólico para ele a partir de ~/dir2 sem passar para ~/ e se não for por que esse é o caso?

Eu tentei de ~/ em execução:

$ ln -s ./dir1/file.txt ./dir2/file.txt

mas, como eu esperava, isso faz com que o symlink resultante aponte efetivamente para ~/dir1/dir2/file.txt , o que faz sentido, mas não é o que eu realmente quero.

Eu também tentei:

$ ln -s ./dir1/file.txt ../dir2/file.txt

Que retorna:

ln: failed to create symbolic link '../dir2/file.txt': No such file or directory

Espero que isso apenas crie um link simbólico ~/dir2/file.txt apontando para ~/../dir1/file.txt

Então, suponho que a minha verdadeira questão seja esta: posso forçar o ln a fazer um link simbólico para um arquivo que ele acha que não existe?

Editar: Para maior clareza sobre o que estou tentando alcançar, quero um único comando que possa ser executado no meu diretório inicial que será efetivamente feito:

pushd dir2/ && ln -s ../dir1/file.txt && popd

ou em Python (é o mais próximo que cheguei do que quero):

echo "import os; os.symlink('../dir1/file.txt', './dir2/file.txt')" | python
    
por nettux443 13.05.2014 / 17:44

2 respostas

1

Você pode fazer qualquer um dos

  1. Use caminhos absolutos

    $ ln -s ~/dir1/file.txt ~/dir2
    $ readlink dir2/file.txt 
    /home/terdon/dir1/file.txt
    
  2. Use os caminhos relativos à direita

    $ ln -s ../dir1/file.txt dir2/
    $ readlink dir2/file.txt 
    ../dir1/file.txt
    

Dependendo do seu caso de uso, um pode ser melhor que o outro. Basta lembrar que ao criar links usando caminhos relativos, os caminhos devem ser relativos ao destino e não à sua localização atual.

    
por 14.05.2014 / 01:33
2

Sua pergunta é meio confusa.

  1. Você perguntou "Existe alguma maneira que eu possa fazer um link simbólico para ele de ~/dir1 [...]?" Eu suponho que você quis dizer "de ~/dir2 ", com base no resto do seu post?

  2. Seu primeiro comando

    $ ln -s ./dir1/file.txt ./dir2/file.txt

    não faz o que você acha que faz. Supondo que você ainda esteja em seu diretório home, o comando acima cria um link simbólico cujo próprio caminho é ~/dir2/file.txt , e este link simbólico aponta literalmente para o caminho ./dir1/file.txt . Como o referido link simbólico reside no diretório ~/dir2 , esse caminho de destino é resolvido para ~/dir2/./dir1/file.txt , o que resolve ainda mais para ~/dir2/dir1/file.txt (provavelmente inexistente e não o que você deseja). Então duvido porque você disse que resolve ~/dir1/dir2/file.txt .

  3. Seu segundo comando falha porque não há diretório ../dir2 para colocar o link simbólico, e é isso que a mensagem de erro significava.

  4. Para responder à sua pergunta, sim. O sistema operacional não se importa se o seu link simbólico aponta para um caminho sem nenhum objeto de sistema de arquivos válido presente.

Provavelmente o que você realmente quer é algo como

ln -s ../dir1/file.txt ./dir2/file.txt

Eu acho? Esse comando cria um link simbólico cujo próprio caminho é ./dir2/file.txt e seu destino é o caminho relativo literal ../dir1/file.txt . O caminho final e absoluto apontado pelo link simbólico é ~/dir2/../dir1/file.txt , que resolve para ~/dir1/file.txt .

Observe que o símbolo ~ é um caractere expansível do shell que é expandido para o caminho absoluto do seu diretório inicial. A ~ -expansion não faz parte da resolução do caminho do SO.

Leitura sugerida

Manpages do Linux de path_resolution(7) , symlink(7) , ln(1) e ln(1p) .

Editar

Esclarecimentos e amp; leitura sugerida.

    
por 13.05.2014 / 18:15