Algumas implementações do comando grep
, como o GNU grep
, podem reciclar diretórios por conta própria. Se você está procurando por "blahblah", você pode fazer isso:
$ grep -r "blahblah" .
Isto irá grep
através de todos os arquivos e diretórios começando recursivamente no diretório atual, .
(cuidado com algumas implementações, como versões antigas do GNU grep
também seguirão links simbólicos ao descer a árvore de diretórios). Isso mostrará os nomes dos arquivos e o resultado que correspondeu ao padrão de pesquisa, um por linha. Se você quiser apenas os nomes de arquivos sem o conteúdo correspondente, adicione a opção -l
a grep
.
$ grep -rl "blahblah" .
Se você realmente quiser usar find
, pode usar a capacidade de find
de executar comandos em relação aos arquivos que encontrar, usando a opção -exec
.
$ find . -type f -exec grep "blahblah" {} +
O +
no final é a chave, pois determinará o número ideal de nomes de arquivos que find
localiza e chamará grep
carregando a linha de comando com quantos couberem. Esses nomes de arquivos serão colocados onde as chaves estão, {}
. É mais fácil visualizar o que está fazendo, se substituirmos o comando echo
no lugar de grep
você verá o que quero dizer.
Exemplo
Digamos que eu tenha os dados de amostra a seguir.
$ mkdir -p dir{1..3}
$ touch file{1..3}
$ touch dir{1..3}/file{A..C}
Agora, quando eu executo o comando find
acima usando echo
como nosso grep
:
$ find . -type f -exec echo {} +
./file2 ./file1 ./dir2/fileA ./dir2/fileB ./dir2/fileC ./dir3/fileA ./dir3/fileB ./dir3/fileC ./file3 ./dir1/fileA ./dir1/fileB ./dir1/fileC
Todos esses arquivos foram ecoados na tela por um único echo
, portanto, este método é muito eficiente em chamar apenas echo
ou grep
apenas o número mínimo de vezes necessário, passando quantos nomes de arquivos puder para cada um.
Usando -type f
acima, estamos pesquisando apenas em arquivos regulares , enquanto grep
geralmente procuraria em todos os arquivos como fifos, sockets, devices (mas não necessariamente symlinks). Você pode passar uma opção -D skip
para algumas versões de grep
para evitar procurar dispositivos / sockets / fifos.