Cria um link simbólico para um caminho relativo

52

Eu posso fazer isso:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Mas gostaria de poder fazer isso:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Isso é possível? Posso de alguma forma resolver o nome do caminho relativo e passá-lo para ln ?

    
por Humphrey Bogart 31.03.2011 / 14:10

7 respostas

52

Se você criar um link simbólico para um caminho relativo, ele será armazenado como um link simbólico relativo, não absoluto, como seu exemplo mostra. Isso geralmente é uma coisa boa. Links simbólicos absolutos não funcionam quando o sistema de arquivos é montado em outro lugar.

O motivo pelo qual seu exemplo não funciona é que ele é relativo ao diretório pai do link simbólico e não ao local em que ln é executado.

Você pode fazer:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Ou para isso:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

É importante perceber que o primeiro argumento após ln -s é armazenado como o destino do symlink. Pode ser qualquer string arbitrária (com as únicas restrições que não pode ser vazia e não pode conter o caracter NUL), mas no momento em que o symlink está sendo usado e resolvido, essa string é entendida como um caminho relativo para o diretório pai do symlink (quando não começa com / ).

    
por 31.03.2011 / 14:28
19

Se você usa coreutils mais recentes (estou usando o coreutils-8.22-11), tem uma opção para fazer isso:

ln --help | grep relative

pode conter texto arbitrário; se mais tarde for resolvido, um link relativo é   -r, --relative cria links simbólicos relativos ao local do link

Por exemplo:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
    
por 25.08.2014 / 17:03
12

Desculpe, não. Os links simbólicos são relativos ao local em que o link está, não ao local em que você estava quando criou o link. Existem várias boas razões para esse comportamento, a maioria das quais envolve a montagem de sistemas de arquivos remotos.

    
por 31.03.2011 / 14:29
7

Existe um pequeno e conveniente utilitário chamado symlinks (originalmente de Mark Lords, agora mantido por J. Brandt Buckley), presente em muitas distribuições Linux.

Para converter todos os links simbólicos absolutos em um diretório para serem relativos:

symlinks -c /path/to/directory

Infelizmente, não há nenhuma opção para converter um único link, você teria que movê-lo para seu próprio diretório primeiro.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp
    
por 08.08.2015 / 13:55
2

Você pode tentar:

ln -s 'pwd'/bar.txt /home/beau/bar.txt

Mas, faz um link simbólico para o caminho absoluto. Sua pergunta textual pede para mencionar o caminho relativo ...

Normalmente, um nome de caminho relativo é o que você deseja e o que ln -s oferece. Eu acho que o que você quer é:

cd /home/beau
ln -s foo/bar.txt bar.txt
    
por 31.03.2011 / 14:29
1

Como os shells mais comuns expandem os caminhos, para criar um link simbólico relativo, você deve citar o "caminho de origem".

Além disso, o parâmetro -s significa --symbolic . ln cria links físicos por padrão.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
    
por 06.08.2013 / 06:45
0

Se você tem certeza de que não há chance de seus pontos de montagem mudarem, você pode conseguir o que está tentando fazer em um shell bash como este:

ln -s 'pwd'/bar.txt ~/bar.txt

Isso pressupõe que você esteja no diretório de destino ao criar o link simbólico.

    
por 21.11.2017 / 15:04

Tags