Refatorando o loop sobre find para usar exec

3

Eu tenho um script bash que é semelhante ao seguinte:

for src in $(find -H "$DOTFILES_ROOT" -maxdepth 2 -name '*.sym' -not -path '*.git*')
 do
   dst="$HOME/$(basename "${src%.*}")"
   link_file "$src" "$dst"
 done

Eu corri o shellcheck no meu script e ele retornou

For loops over find output are fragile. Use find -exec or a while read loop.

O que eu li é compreendido e faz sentido para mim, por exemplo.

find -H "$(pwd)" -maxdepth 2 -name '*.sym' -not -path '*.git*' -exec echo {} \;

Mas não sei como fazer funcionar com uma variável como no loop for

    
por user215541 11.02.2017 / 19:19

1 resposta

1

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:

por 22.06.2018 / 13:08