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: