Localiza uma string somente em um arquivo específico dentro de subdiretórios

8

Digamos que eu precise encontrar a função GetTypes() em todos os arquivos de código-fonte C # ( .cs ) dos diretórios / subdiretórios.

Eu usei grep -rn GetTypes *.cs , mas recebi um erro com grep: *.cs: No such file or directory . Eu tive que usar grep -rn GetTypes * , mas neste caso ele mostra todos os arquivos não *.cs .

Qual comando eu preciso usar para encontrar a string apenas em .cs files?

    
por prosseek 06.06.2011 / 15:56

4 respostas

10

Se o seu shell é bash ≥4, coloque shopt -s globstar no seu ~/.bashrc . Se o seu shell é zsh, você é bom. Então você pode correr

grep -n GetTypes **/*.cs

**/*.cs significa todos os arquivos correspondentes a *.cs no diretório atual ou em seus subdiretórios, de forma recursiva.

Se você não estiver executando um shell que suporte ** , mas o seu grep suportar --include , você pode fazer um grep recursivo e informar grep para considerar apenas arquivos que correspondam a determinados padrões. Observe as aspas em torno do padrão do nome do arquivo: ele é interpretado pelo grep, não pelo shell.

grep -rn --include='*.cs' GetTypes .

Com apenas ferramentas portáteis (alguns sistemas não têm grep -r ), use find para a parte de passagem de diretório e grep para a parte de pesquisa de texto.

find . -name '*.cs' -exec grep -n GetTypes {} +
    
por 06.06.2011 / 23:23
6

Você deve conferir o pequeno substituto financeiro do grep / find conhecido como ack . Ele é especificamente configurado para pesquisar por diretórios de arquivos de código-fonte.

Seu comando ficaria assim:

ack --csharp GetTypes
    
por 06.06.2011 / 16:11
4

Estou usando uma combinação de find e grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

Para find , você pode substituir . por um diretório e remover -name se quiser procurar em todos os arquivos.

Para grep , -bn imprimirá a posição e o número da linha e --color ajudarão seus olhos, destacando o que você está procurando.

    
por 06.06.2011 / 16:04
3

Se você usar o GNU grep , poderá especificar quais arquivos incluir em uma passagem de diretório recursiva:

grep --include '*.cs' -rn GetTypes .

(onde o último período denota o diretório de trabalho atual como raiz do percurso)

    
por 06.06.2011 / 21:46