Você não poderia simplesmente recriar os links simbólicos?
cd ~/bin; for f in ../sh/*.sh; do ln -sf $f $(basename $f .sh); done
Outras opções:
-
cd ~/bin; find . -lname '/Users/oldname/sh/*' -exec ln -sf ../sh/{}.sh {} \; -
cd ~/bin; for f in *; do target=$(readlink $f); [[ $target = /Users/oldname/* ]] && ln -sf ${target/oldname/newname} .; done
ln não sobrescreve arquivos existentes sem -f . find -lname corresponde aos alvos dos links simbólicos.