foo/bares un directorio (y tiene permiso de búsqueda foopara poder determinar que foo/bares un directorio). En ese caso, cuando haces:
ln -s new/target link
o
ln -fs new/target link
Se entiende como crear un nuevo targetenlace simbólico dentro del linkdirectorio ( linkes un directorio porque es un enlace simbólico al foo/bardirectorio). Entonces realmente crearás un:
foo/bar/target -> new/target
Para superar eso, GNU lntiene una -Topció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 linkenlace simbólico original y lo creará de nuevo con new/targetel objetivo (y el proceso 'euid y egid como propietario).
GNU lntambién tiene una -nopción. Funciona como, -Texcepto cuando en linkrealidad 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