Только с инструментами POSIX единственный способ увидеть цель символической ссылки - через ls
. Команда Linux и BSD, readlink
к сожалению, не является стандартной.
Использование ls
хрупко, потому что вы должны разобрать имена файлов. Предполагая, что имена файлов не содержат символов новой строки и что цели символических ссылок не содержат подстроки ->
, команда ls -l "$link" | sed 's/.* -> //'
печатает цель ссылки.
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