
Estoy intentando modificar lo siguiente para cambiar el nombre de algunos enlaces simbólicos:
find /home/user/public_html/qa/ -type l \
-lname '/home/user/public_html/dev/*' -printf \
'ln -nsf $(readlink %p|sed s/dev/qa/) $(echo %p|sed s/dev/qa/)\n'\
> script.sh
Lamentablemente la -lname
opción no funciona para HPUX. ¿Conoces algo equivalente que pueda usar?
Sólo para darle una idea de mi problema, quiero cambiar todos los enlaces simbólicos dentro de una carpeta en particular.
New Symbolic link --> /base/testusr/scripts
Old Symbolic link --> /base/produsr/scripts
Ahora la carpeta "A" contiene más de 100 archivos diferentes que tienen enlaces suaves que necesito cambiar de esta manera.
Respuesta1
Sólo con herramientas POSIX, la única forma de ver el destino de un enlace simbólico es a través de ls
. Lamentablemente, el comando de Linux y BSD readlink
no es estándar.
El uso ls
es frágil porque hay que analizar los nombres de los archivos. Suponiendo que los nombres de sus archivos no contienen nuevas líneas y que los destinos de los enlaces simbólicos no contienen la subcadena ->
, el comando ls -l "$link" | sed 's/.* -> //'
imprime el destino del enlace.
find /home/user/public_html/qa/ -type l |
while IFS= read -r link; do
target=$(ls -l "$link" | sed 's/.* -> //')
case $target in
/home/user/public_html/dev/*)
link_to_change=$(echo "$link" | sed s/dev/qa/)
ln -nsf "$(echo "$target" | sed s/dev/qa/)" "$link_to_change";;
esac
done