foo/bar
es un directorio (y tiene permiso de búsqueda foo
para poder determinar que foo/bar
es un directorio). En ese caso, cuando haces:
ln -s new/target link
o
ln -fs new/target link
Se entiende como crear un nuevo target
enlace simbólico dentro del link
directorio ( link
es un directorio porque es un enlace simbólico al foo/bar
directorio). Entonces realmente crearás un:
foo/bar/target -> new/target
Para superar eso, GNU ln
tiene una -T
opción para que el nombre del enlace se considere siempre como el nombre del enlace, y no como un directorio para crear los enlaces. Entonces, con GNU ln
:
ln -fsT new/target link
trabajará. Al igual que antes, eliminará el link
enlace simbólico original y lo creará de nuevo con new/target
el objetivo (y el proceso 'euid y egid como propietario).
GNU ln
también tiene una -n
opción. Funciona como, -T
excepto cuando en link
realidad es un directorio real, en cuyo caso aún creará el enlace simbólico dentro de ese directorio (en lugar de fallar con un error).
Portablemente, su mejor opción es eliminar primero el enlace y luego volver a crearlo:
rm -f link && ln -s new/target link