
Estou tentando modificar o seguinte para renomear alguns links 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
Infelizmente, a -lname
opção não funciona para HPUX. Você conhece algo equivalente que eu possa usar?
Só para você ter uma ideia do meu problema, quero alterar todos os links simbólicos dentro de uma pasta específica.
New Symbolic link --> /base/testusr/scripts
Old Symbolic link --> /base/produsr/scripts
Agora, a pasta "A" contém mais de 100 arquivos diferentes com links virtuais que preciso alterar dessa maneira.
Responder1
Somente com ferramentas POSIX, a única maneira de ver o destino de um link simbólico é através do ls
. Infelizmente , o comando Linux e BSD readlink
não é padrão.
Usar ls
é frágil porque você precisa analisar os nomes dos arquivos. Supondo que os nomes dos seus arquivos não contenham novas linhas e que os alvos dos links simbólicos não contenham a substring ->
, o comando ls -l "$link" | sed 's/.* -> //'
imprime o alvo do link.
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