Encontrando uma string em um arquivo em um sistema de arquivos usando Grep

3

Eu preciso fazer uma pesquisa em vários arquivos em um sistema de arquivos para procurar por uma string "RUSH2112". Eu completei o seguinte comando, no entanto, não tenho certeza se isso está correto. Eu estou no sistema de arquivos montado.

find . -type f -exec grep -i1 "Rush2112" {} \; 
    
por Deirdre 01.11.2018 / 13:08

1 resposta

7

Para procurar uma string (não uma expressão regular) sem se preocupar com caso, use grep -iF STRING (onde STRING deve ser a string citada que você está procurando).

Para recapitular todos os arquivos regulares em uma hierarquia de diretórios,

find . -type f -exec grep -iF STRING /dev/null {} +

A principal diferença entre este e seu comando é que isso executará grep para grupos de arquivos encontrados. Seu comando executaria grep uma vez para cada arquivo encontrado, o que pode ser mais lento se houver muitos arquivos. É o + no final que faz essa diferença.

A outra diferença é que, como grep é invocado com mais de um arquivo, sua saída conterá os nomes de caminho dos arquivos em que as correspondências são encontradas. O /dev/null está lá para forçar esse comportamento no caso de grep ser chamado com apenas um único arquivo. Você pode usar a opção grep -H em vez de incluir /dev/null se sua implementação de grep tiver essa opção não padrão (mas comum).

Alguma implementação de grep também tem a opção de recuperar diretórios por si só, sem a ajuda de find . Isso geralmente é feito com uma opção -R :

grep -R -iF STRING .

Observe que o GNU grep também tem uma opção -r que é um pouco diferente da opção -R (com -r , links simbólicos não serão seguidos, o que imitaria mais de perto o comportamento que você obteria com a execução de grep via find . -type f ).

Se o que você procura é encontrar apenas os nomes de caminho dos arquivos que contêm a string e não necessariamente as linhas reais daqueles arquivos que correspondem, então você pode fazer isso de várias maneiras diferentes (todas amplamente análogas a o que foi mencionado acima).

  • Use grep -q como um teste em cada arquivo:

    find . -type f -exec grep -qiF STRING {} ';' -print
    
  • Use grep -l nos grupos de arquivos encontrados por find :

    find . -type f -exec grep -ilF STRING {} +
    
  • Use recursivo grep -l :

    grep -R -ilF STRING .
    

Se você está querendo fazer mais processamento dos arquivos que contêm a string dada, então eu iria com a primeira destas alternativas:

find . -type f -exec grep -qiF STRING {} ';' -exec sh -c '
    for pathname do
        # Process "$pathname" here
    done' sh {} +

ou, fazendo o grep dentro do script in-line:

find . -type f -exec sh -c '
    for pathname do
        if grep -qiF STRING "$pathname"; then
            # Process "$pathname" here
        fi
    done' sh {} +

Relacionados:

por 01.11.2018 / 13:36

Tags