Verificando arquivos em busca de uma string usando um loop

Verificando arquivos em busca de uma string usando um loop

Estou tentando percorrer arquivos em um diretório que começa com a string indicada na forinstrução. Dentro do loop, quero procurar a string padrão foono arquivo. Se a string for encontrada no arquivo que echodesejo $filename.

#!/ppp/bash

for filename in $(find ~/filesList -type f -name "pge_*")
do
      #If 'foo' located echo $filename
      
done

Qualquer sugestão será muito bem-vinda.

Responder1

Utilize findpara executar grep:

find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +

-llista os nomes dos arquivos que contêm uma correspondência para foo. -Fsignifica que a expressão foodeve ser considerada uma string fixa em vez de uma expressão regular.

Responder2

Primeira sugestão - não há necessidade de usar findno seu forloop, pois isso torna as coisas mais lentas. Em vez disso, você pode fazer algo como:

for f in ~/filesList/pge_*

Uma advertência bastante importante é que esta versão simplificada não pesquisará subdiretórios ~/filesListenquanto a findversão o fará, portanto, dependendo do seu caso de uso real, talvez você não consiga simplificar.

Quanto à pesquisa nesses arquivos, você desejará usar um greptipo de construção:

if (grep needle haystack > /dev/null 2>&1)
then
  echo $f
fi

Ao grepencontrar a agulha que procura, ele retorna um valor diferente de zero, portanto a condição é avaliada como TRUE. Eu uso o > /dev/null 2>&1para evitar ver os resultados do grep. Se grepnão encontrar a agulha no palheiro, seu código de retorno é 0, portanto a condicional é FALSE, ignorando a theninstrução.

informação relacionada