As variáveis no loop for que você tem são src e dst . src é o nome do caminho de um arquivo dado ao loop por find e dst é calculado a partir de src .
Seu loop pode ser convertido em um comando find -exec da seguinte forma:
find -H "$DOTFILES_ROOT" -maxdepth 2 -type d -name '.git' -prune -o \
-type f -name '*.sym' -exec sh -c '
link_file "$1" "$HOME/$( basename "${1%.*}" )"' sh {} ';'
Eu assumi que você por -not -path '*.git*' pretende não procurar em .git diretórios. Isso é o mesmo que -type d -name '.git' -prune no comando acima, mas com -prune , paramos find de entrar nesses diretórios.
Depois de eliminarmos os diretórios .git , procuramos por .sym files. Quando um é encontrado, o comando do seu loop é executado. O comando é executado através de sh -c (para poder fazer coisas sofisticadas com substituições de parâmetros e basename ) e o nome do caminho do arquivo encontrado é disponibilizado como $1 .
Pode-se até incorporar o seu loop (quase) como você o escreveu:
find -H "$DOTFILES_ROOT" -maxdepth 2 -type d -name '.git' -prune -o \
-type f -name '*.sym' -exec sh -c '
for src do
dst="$HOME/$( basename "${src%.*}" )"
link_file "$src" "$dst"
done' sh {} +
Nesse caso, o script sh -c não recebe um único nome de caminho, mas um número deles (devido ao + no final do -exec ), então fazemos um loop sobre eles e executamos a ação.
Relacionados: