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.