foo/bar
é um diretório (e você tem permissão de pesquisa foo
para poder determinar que foo/bar
é um diretório). Nesse caso, quando você faz:
ln -s new/target link
ou
ln -fs new/target link
Isso é entendido como a criação de um novo target
link simbólico dentro do link
diretório ( link
é um diretório porque é um link simbólico para o foo/bar
diretório). Então, você realmente criará um:
foo/bar/target -> new/target
Para superar isso, o GNU ln
tem uma -T
opção para que o nome do link seja sempre considerado como nome do link, e não como um diretório para criar o (s) link (s). Portanto, com o GNU ln
:
ln -fsT new/target link
vai funcionar. Como antes, ele removerá o link
link simbólico original e o criará novamente new/target
como o destino (e o processo 'euid e egid como o proprietário).
O GNU ln
também tem uma -n
opção. Funciona como, -T
exceto quando, link
na verdade, é um diretório real; nesse caso, ele ainda criará o link simbólico dentro desse diretório (em vez de falhar com um erro).
Portably, sua melhor opção é remover o link primeiro e depois recriá-lo:
rm -f link && ln -s new/target link