Usando find com sh - comando não funciona

Usando find com sh - comando não funciona

Estou tentando procurar arquivos que possuam pattern FW. A partir desses arquivos filtrados, estou tentando pesquisar pattern chmod.*archive|archive.*chmode listá-los.

Tentei com o comando abaixo, mas não me deu a saída desejada. Preciso de ajuda para resolver esse problema.

find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more

Responder1

Se bem entendi, tudo que você precisa é:

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

Isso servirá greppara o seu padrão em cada arquivo encontrado por finde, se for grepbem-sucedido, listará o arquivo em um formato semelhante a ls -l.

Responder2

Como alternativa ao que @terdon propôs, você provavelmente também poderia usar o seguinte comando:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW

EDITAR

Como @Kusalananda apontou:

Isso falharia (daria a saída errada) se você tivesse correspondências em arquivos localizados em diretórios que contenham FW em seus nomes.

Ajustá-lo para funcionar corretamente torna-o muito menos legível. A solução proposta por @terdon é uma opção mais favorável (também mais eficiente - veja o comentário de @tedron).

No entanto, aqui está uma versão corrigida:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'

Responder3

Você tem duas opções para obter os nomes de caminho que correspondem aos arquivos que possuem linhas que correspondem ao seu padrão:

  1. Vamos findgerar os nomes dos caminhos:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    Isso é executado grepem cada arquivo encontrado individualmente e, em seguida, imprime os nomes de caminho para cada arquivo que contém correspondências para o padrão (que, a propósito, transformei em um conjunto compatível com o padrão de duas expressões regulares básicas separadas, já que todo o resto na resposta era padrão).

    Provavelmente é isso que você gostaria de usar se quiser fazer outra coisa com os nomes de caminho além de apenas imprimi-los no terminal (basta adicionar mais -execações).

  2. Vamos grepgerar os nomes dos caminhos:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    Isso é executado grepem lotes de arquivos encontrados. O greputilitário reportará os nomes dos caminhos de cada arquivo correspondente, de acordo com sua -lopção ("dash-ell").

    É provável que isso seja executado mais rapidamente, pois minimiza o número de grepinvocações feitas e seria o que você faria se quisesse apenasolharnos nomes dos caminhos.

informação relacionada