Como posso receber recursivamente arquivos específicos em um diretório?

14

Eu sou novo no linux e grep e estou tentando encontrar o caminho.

Ao usar find -name *.java, sou capaz de encontrar os nomes de todos os arquivos java em um diretório específico. Suponha que eu queira contar o número de vezes que fooesses arquivos ocorrem, como eu faria isso?

Eu tenho tentado coisas como:

grep -r "foo" *.java

e obter respostas como:

grep:  *.java:  No such file or directory

Alguma ideia?

Eric Wilson
fonte
1
Desculpe, vou procurar mais na próxima vez. É notável que as perguntas eram tão parecidas.
Eric Wilson
1
O título de 3512 poderia ser muito melhor. A "questão básica de uso do grep" não diz muito sobre a questão real. Provavelmente teremos mais idiotas, a menos que isso seja corrigido.
Richard Hoskins
1
@richardhoskins, corrigido.
John T

Respostas:

16
find . -name '*.java' | xargs grep <your pattern here>
Arathorn
fonte
5
Melhor ainda, use itens terminados nulos para que um nome de arquivo com um espaço nele não seja dividido em dois nomes de arquivo: find. -name '* .java' -tipo f -print0 | xargs -0 grep <seu padrão aqui>
CoverosGene
1
@CoverosGene: Você pode usar a opção --replace no xargs para lidar com isso - assim: ... | xargs --replace grep "{}" <pattern>
Arathorn
muito obrigado, eu sabia que deveria haver um comando que faz o que xargsfaz.
Eric Wilson
6

Existe uma ferramenta especialmente projetada para esse tipo de necessidade: ack .

O ack é uma ferramenta como grep, direcionada a programadores com grandes árvores de código-fonte heterogêneo

Leia também os "10 principais motivos para usar o ack em vez do grep". na página de confirmação .

user4126
fonte
1
Meh. Uma ferramenta unix real precisa de um nome recursivo que refira sua herança ... como abtg [Better Than Grep do ABTG], ou algo assim. ACK? O único bom pensar sobre isso é que o autor do NACK melhorou já um nome escolhido;)
Mikeage
Uma das razões pelas quais eu realmente amo ack é que você pode especificar os tipos de arquivo. Por exemplo, com o "ack --html <padrão>", ele pesquisa todos os meus arquivos .html, .htm, .xhtml, .dhtml, etc. de uma só vez.
Mark van Lent
O Ack praticamente substituiu o grep para mim.
22139 Ryan C. Thompson
3

A respeito:

grep -irn --include="*\.java" somePhrase *
Manatok
fonte
0

encontrar . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l

wudeng
fonte
3
Bem-vindo ao SuperUser! Você verá que suas respostas recebem mais atenção quando se trata de perguntas mais atuais (esta é de 2009) e quando explica por que sua resposta é melhor do que a já aceita.
11133 Eric Wilson