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.
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 é:
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:
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).
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).
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.
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!
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.
Respostas:
E o sempre popular
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 é:
Sempre há mais de uma maneira de fazer isso.
fonte
mdfind
é uma maneira mais OSXy de fazer isso !A resposta tradicional do UNIX seria a que foi aceita para esta pergunta:
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:
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).
fonte
Use o grep melhor que o grep, ack :
fonte
Na verdade, isso usará uma regex, se você quiser, fique longe dos metacaracteres ou escape deles, e você pode procurar por strings.
fonte
fonte
Como esta é uma pergunta do OSX, aqui está uma resposta mais específica do OSX.
Pule
find
e useSpotlight
na linha de comando. Muito mais poderoso!PROJETO DE LINHA DE COMANDO - ENCONTRAR ENCONTRA GREP
fonte
Experimente:
fonte
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.
fonte
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.
fonte