Como encontro a localização de todos os arquivos com um nome específico cujo conteúdo contém uma string específica?

1

Eu quero encontrar a localização de todos os arquivos chamados index.php que contêm a string "hello".

obrigado.

    
por david 22.08.2017 / 17:57

5 respostas

9

Usando grep com find :

find /top-dir -type f -name index.php -exec grep -l 'hello' {} +

em que /top-dir é o caminho para o diretório mais importante que você deseja pesquisar.

Com -type f , apenas analisamos os arquivos regulares com find e, com -name index.php , restringimos a pesquisa a arquivos chamados index.php .

-exec grep -l 'hello' {} + executará grep nos arquivos encontrados e exibirá os caminhos de todos os arquivos que correspondem ao padrão ( 'hello' ). É o -l com grep que causa a saída dos caminhos.

Com + no final, find fornecerá o maior número de arquivos possível para cada chamada de grep . Alterar isso para ';' ou \; resultaria em grep sendo invocado com um arquivo por vez, que pode ser lento se houver muitos arquivos.

    
por 22.08.2017 / 18:13
3

Use grep da seguinte forma dentro de um comando find :

find -type f -name "index.php" -exec grep -q 'hello' '{}' \; -exec echo '{}' \;
    
por 22.08.2017 / 17:59
2

Se você estiver usando o bash shell, ative a opção globstar , então ** irá corresponder dentro de subdiretórios, então use apenas grep como normal:

shopt -s globstar
grep -l hello **/index.php

(Você só precisa shopt -s globstar uma vez em um shell, a menos que você desative a opção com shopt -u globstar .)

    
por 22.08.2017 / 18:19
1

Aqui está uma abordagem somente do GNU grep que está retornando o caminho relativo dos arquivos correspondentes no diretório de trabalho atual e recursivamente e apenas o nome dos arquivos é 'index.php'.

grep -rl --include="index.php" "hello" .

Aqui também é possível obter o caminho absoluto dos arquivos correspondentes, substituindo . por ${PWD} :

grep -rl --include="index.php" "hello" "${PWD}"
    
por 23.08.2017 / 06:24
0

Mais 2 maneiras com o comando find :

find -type f -name "index.php" -exec grep -l 'hello' {} \;
find -type f -name "index.php" -exec grep -q 'hello' {} \; -print
    
por 22.08.2017 / 18:25