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 porfind
: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: