Como alterar um link simbólico para um diretório para outro destino?

7
# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’

Agora quero substituir esse destino por target2:

# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’

Whoa! O que aconteceu lá? Barras à direita não têm efeito algum:

ln -sfv /path/to/target2/ /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2/ /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2 /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2’

Como alcançar ’/path/to/link’ -> ’/path/to/target2’ ?

    
por Ars Magika 04.05.2014 / 11:51

2 respostas

12

Use -n / --no-dereference ("trate LINK_NAME como um arquivo normal se for um link simbólico para um diretório"):

$ ln -sv /var/log /tmp/my-link
‘/tmp/my-link’ -> ‘/var/log’
$ ln -sfnv /var/opt /tmp/my-link
‘/tmp/my-link’ -> ‘/var/opt’

Ou seja, ln -s target link funcionará como ln -s target link/target se link vincular a um diretório .

A maioria das ferramentas de comando do Linux tentará desreferenciar links simbólicos antes de aplicar sua ação, caso contrário, os links simbólicos seriam, na maioria das vezes, apenas confusos e quase inúteis. Eu acho que os autores originais de ln pensaram que a consistência era mais importante do que uma certa quantidade de simplicidade (com o risco de confundir as pessoas acostumadas com outras ferramentas) neste caso.

    
por 04.05.2014 / 12:21
2

A resposta de l0b0 é boa. É simples, e isso faz com que seja o melhor para a linha de comando usar a maior parte do tempo. Em alguns casos, você pode se importar que não seja atômico. ln -sf primeiro exclui o link simbólico antigo e cria o novo. Portanto, há um breve período em que não existe nenhum link simbólico.

Se precisar ser cuidadoso, é melhor criar o novo symlink em um local temporário e, em seguida, mv no lugar.

Há uma implementação rubi disso aqui: link . Seria fácil implementar em qualquer idioma. Bate-me porque não é o comportamento padrão de ln.

    
por 04.05.2014 / 15:08