saída de tubulação do comando find

saída de tubulação do comando find

Seguindo minha consulta postada - Usando find com sh - comando não funciona

Com base no o/p do comando abaixo, preciso atualizar a permissão para 777 para cada um dos arquivos listados.

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

Existe alguma maneira de canalizar a saída chmode atualizar as permissões do arquivo?

Responder1

Você pode adicionar outro -execpara findexecutar chmodnos arquivos. Remova o -lsse não precisar dele:

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
  -ls -exec chmod 777 {} +

Responder2

Você pode adicionar outro -execno final para atualizar as permissões nos arquivos que passam nos testes anteriores,como Freddy mostra, ou você pode combinar grepe chmodem um sh -cscript embutido:

find . -type f -name '*FW*' -exec sh -c '
    for pathname do
        if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
        then
            chmod 777 "$pathname"
        fi
    done' sh {} +

Isso seria usado findcomo uma espécie de gerador de nomes de caminhos para o loop no sh -cscript.

Este loop pega todos os nomes de caminho fornecidos ao script embutido, testa cada um deles com grepe, se o padrão corresponder em um arquivo, esse arquivo terá suas permissões (possivelmente) atualizadas.


Em bash, você pode, em vez de gerar os nomes de caminho por find, usar um padrão globbing de nome de arquivo:

shopt -s globstar nullglob dotglob

for pathname in ./**/*FW*; do
    if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
    then
        chmod 777 "$pathname"
    fi
done

A única diferença visível aqui é que isso também processaria links simbólicos que correspondam ao padrão.

A globstaropção shell habilita o **padrão que corresponde recursivamente em subdiretórios. A nullglobopção shell faz com que os padrões não correspondentes desapareçam em vez de permanecerem sem expansão. A dotglobopção shell faz com que os padrões correspondam a nomes ocultos.

No zshshell, isso pode ser abreviado para

for pathname in ./**/*FW*(.ND); do
    if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
    then
        chmod 777 $pathname
    fi
done

... onde ., Ne Dcorresponde ao -fteste (mas não corresponde a links simbólicos), configurando nullglobe configurando dotglob, bashpor sua vez.

informação relacionada