Encontre uma sequência apenas em um arquivo específico dentro de subdiretórios

10

Digamos que eu preciso encontrar a função GetTypes()em todo o arquivo de origem C # ( .cs) nos 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, mostra todos os arquivos não *.csapenas.

Qual comando eu preciso usar para encontrar a string apenas nos .csarquivos?

prosseek
fonte

Respostas:

12

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

grep -n GetTypes **/*.cs

**/*.cssignifica todos os arquivos correspondentes *.csno diretório atual ou em seus subdiretórios, recursivamente.

Se você não está executando um shell que suporta, **mas o grep suporta --include, você pode executar um grep recursivo e dizer greppara considerar apenas os arquivos que correspondem a determinados padrões. Observe as aspas ao redor do padrão de nome de arquivo: ele é interpretado por grep, não pelo shell.

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

Com apenas ferramentas portáteis (alguns sistemas não possuem grep -r), use findpara a parte transversal do diretório e greppara a parte de pesquisa de texto.

find . -name '*.cs' -exec grep -n GetTypes {} +
Gilles 'SO- parar de ser mau'
fonte
Para conjunto temporário a globstaropção para uma corrente Bash 4+ shell, use: shopt -s globstar.
tjanez
8

Você deve verificar a pequena substituição grep / find conhecida como ack. É especificamente configurado para pesquisar diretórios de arquivos de código-fonte.

Seu comando ficaria assim:

ack --csharp GetTypes
Caleb
fonte
4

Se você usa o GNU grep, pode especificar quais arquivos incluir em um percurso de diretório recursivo:

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

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

maxschlepzig
fonte
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 -namese desejar procurar em todos os arquivos.

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

Kevin
fonte