grep todos os arquivos .java em um diretório para uma sequência específica

12

Como eu procuraria em todos os arquivos .java por uma sequência simples (não um regex) no diretório atual e em todos os subdiretórios do Mac OS X? Eu só quero imprimir uma lista de nomes de arquivos e diretórios correspondentes.

John Topley
fonte
Obrigado por perguntar isso, para que eu não precise. Agora só tenho que descobrir como excluir ".git" e já terminei um pouco.
Dan Rosenstark
Eu acho que a resposta de js é mais concisa, ainda é uma porcaria que você precisa digitar - incluindo, mas ainda assim. Provavelmente poderia escrever apenas um alias para esconder que
Craig Tataryn

Respostas:

19

E o sempre popular

find . -name '*.java' | xargs grep -l 'string'

EDIT (de Frank Szczerba):

Se você estiver lidando com nomes de arquivos ou diretórios com espaços, a maneira mais segura de fazer isso é:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Sempre há mais de uma maneira de fazer isso.

David Mackintosh
fonte
11

A resposta tradicional do UNIX seria a que foi aceita para esta pergunta:

find . -name '*.java' | xargs grep -l 'string'

Provavelmente isso funcionará para arquivos Java, mas os espaços nos nomes de arquivos são muito mais comuns no Mac do que no mundo tradicional do UNIX. Quando nomes de arquivos com espaços são passados ​​pelo pipeline acima, xargs interpretará as palavras individuais como nomes diferentes.

O que você realmente deseja é separar os nomes para tornar os limites inequívocos:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

A alternativa é permitir que o find execute grep, como sugere Mark, embora essa abordagem seja mais lenta se você estiver pesquisando um grande número de arquivos (como o grep é chamado uma vez por arquivo e não uma vez com toda a lista de arquivos).

Frank Szczerba
fonte
Você também pode usar a opção "--replace" no xargs para lidar com nomes de arquivos com espaços: ... | xargs --replace grep 'string' '{}' ({} será substituído pelo nome do arquivo)
Arathorn
1
As versões modernas do find (incluindo o instalado no OS X) suportam "-exec <comando> {} +", onde o sinal de mais no final (em vez de \;) indica ao find para substituir {} por "tantos nomes de caminho quanto possível" ... Isso é semelhante ao de xargs (1) "(da página de manual).
Doug Harris #
7

Use o grep melhor que o grep, ack :

ack -l --java  "string" 
bortzmeyer
fonte
3
O ack não está instalado no Mac OS X por padrão.
31511 John Topley
Não sei o que "por padrão" significa. Em muitos sistemas operacionais, você escolhe o que instalar, por isso é difícil encontrar programas sempre presentes. Em um momento, um compilador C estava sempre lá e Perl era incomum ...
Bortzmeyer
1
Isso significa que faz parte da instalação padrão do sistema operacional. Eu tenho as ferramentas de desenvolvedor instaladas no meu Mac e elas não instalam o ack. Você precisa instalá-lo você mesmo. Se você o tiver, é uma boa sintaxe.
31511 John Topley
No caso do ack, é um único programa Perl sem dependências de módulo. Se você pode "instalar" programas no seu diretório ~ / bin, também pode "facilmente" instalar o ack.
Andy Lester
4

Na verdade, isso usará uma regex, se você quiser, fique longe dos metacaracteres ou escape deles, e você pode procurar por strings.

find . -iname "*.java" -exec egrep -il "search string" {} \;

Mark Thalman
fonte
3
grep -rl --include="*.java" simplestring *
js.
fonte
1
Esta parece ser a melhor resposta aqui - se o grep faz tudo, por que usar o find & xargs?
Peter Gibson
FYI, uma vez que é solicitado na pergunta, ele deve ser pequeno "l" não grande "L" em que comando
Craig Tataryn
Craig está certo, eu corrigi minha resposta.
js.
1

Como esta é uma pergunta do OSX, aqui está uma resposta mais específica do OSX.

Pule finde use Spotlightna linha de comando. Muito mais poderoso!

PROJETO DE LINHA DE COMANDO - ENCONTRAR ENCONTRA GREP

A maioria das pessoas não sabe que você pode fazer pesquisas Spotlight na linha de comando. Por que lembrar todas as opções de localização e grep misteriosas e quando não pode deixar o Spotlight fazer o trabalho por você? A interface da linha de comandos para o Spotlight é chamada mdfind. Ele tem todo o mesmo poder que a pesquisa do GUI Spotlight e muito mais, porque é programável na linha de comando!


fonte
0

Experimente:

grep -rl "string" */*java
dwj
fonte
1
Isto dá "grep: * / * java: Nenhum tal lima ou diretório" no Mac OS X.
John Topley
O problema aqui é que ele encontrará apenas arquivos * .java com um nível de profundidade. Veja a resposta de Mark Thalman para IMHO a maneira correta de fazê-lo.
Ludwig Weinzierl
Desculpe, não no meu Mac. A versão para Mac do grep não possui o sinalizador -r (recursivo)?
dwj
Sim, mas essa foi a saída que obtive ao procurar uma string que eu sei que está nos arquivos.
31413 John Topley
0

Você também pode usar um programa GUI como o TextWrangler para fazer uma pesquisa mais intuitiva, onde as opções estão na interface.

Mark Thalman
fonte
0
grep "(your string)" -rl $(find ./ -name "*.java")

Se você deseja ignorar maiúsculas e minúsculas, substitua -rl por -irl. (sua string) também pode ser uma regex se você vir a necessidade.

laughing_man
fonte