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.
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.
Respostas:
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.
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).
Use o grep melhor que o grep, ack :
ack -l --java "string"
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" {} \;
grep -rl --include="*.java" simplestring *
Pule find
e use Spotlight
na 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!
Experimente:
grep -rl "string" */*java
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.
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.