Localizando uma subseqüência em arquivos em subdiretórios com um único comando interno?

10

No Windows, se eu quisesse encontrar uma string em todos os arquivos em todos os subdiretórios, eu faria algo como

findstr /C:"the string" /S *.h

No entanto, no Linux (digamos, Ubuntu) eu não encontrei outra maneira senão um comando canalizado envolvendo find , xargs e grep (um exemplo é nesta página: Como posso recursivamente percorrer subdiretórios? . No entanto, minha pergunta é diferente: existe algum comando único e embutido que funcione por meio dessa mágica, sem ter que escrever meu script de shell?

    
por Guido Domenici 14.02.2011 / 14:16

4 respostas

17

O GNU grep permite pesquisar recursivamente por subdiretórios:

grep -r --include='*.h' 'the string' .
    
por 14.02.2011 / 14:40
2

grep -r searchpattern /path/to/start/in

Em que /path/to/start/in/ pode ser apenas " . " para o diretório atual.

    
por 15.04.2011 / 22:16
1

Não. find -name \*.h -print0 | xargs -0 grep -l 'the regex' é tão mágico quanto possível.

    
por 14.02.2011 / 14:26
0

is there any single, built-in command that works through this magic ... ?

Para ser pedante, não, você não pode assumir que tal comando exista .

Existem muitas implementações diferentes do Unix, e cada uma tem suas peculiaridades. POSIX, o denominador comum (e o mais próximo de um padrão nos Unices) não especifica essa opção para grep .

Como mencionado em outras respostas, a implementação do grep do GNU tem uma opção não padrão que faz o que você quer. Embora essa implementação específica possa ser comum em sistemas Linux, você não pode assumir sua disponibilidade em qualquer Unix, nem mesmo em alguns sistemas Linux.

Finalmente, devo mencionar que é a filosofia Unix que favorece a combinação de vários programas primitivos, sobre o uso de um grande executável monolítico tentando fazer tudo de uma vez.

No seu caso, o rastreamento do sistema de arquivos e a correspondência do regexp em um fluxo são duas tarefas separadas. É normal tratar cada um em um programa separado.

    
por 27.06.2012 / 17:36