Come avrei cercato tutti i file .java per una stringa semplice (non una regex) nella directory corrente e in tutte le sottodirectory su Mac OS X? Voglio solo stampare un elenco di nomi di file e directory corrispondenti.
Come avrei cercato tutti i file .java per una stringa semplice (non una regex) nella directory corrente e in tutte le sottodirectory su Mac OS X? Voglio solo stampare un elenco di nomi di file e directory corrispondenti.
Risposte:
E il sempre popolare
find . -name '*.java' | xargs grep -l 'string'
EDIT (di Frank Szczerba):
Se hai a che fare con nomi di file o directory che contengono spazi, il modo più sicuro per farlo è:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
C'è sempre più di un modo per farlo.
mdfind
è un modo più OSXy per farlo !
La tradizionale risposta UNIX sarebbe stata quella accettata per questa domanda:
find . -name '*.java' | xargs grep -l 'string'
Questo probabilmente funzionerà con i file Java, ma gli spazi nei nomi dei file sono molto più comuni su Mac che nel tradizionale mondo UNIX. Quando i nomi di file con spazi vengono passati attraverso la pipeline sopra, xargs interpreterà le singole parole come nomi diversi.
Quello che vuoi davvero è annullare i nomi per rendere inequivocabili i confini:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
L'alternativa è quella di far eseguire grep per te, come suggerisce Mark, sebbene questo approccio sia più lento se stai cercando un numero elevato di file (poiché grep viene invocato una volta per file anziché una volta con l'intero elenco di file).
Usa grep che è meglio di grep, ack :
ack -l --java "string"
Questo in realtà userà una regex se vuoi, stai lontano dai metacaratteri o sfuggili e puoi cercare le stringhe.
find . -iname "*.java" -exec egrep -il "search string" {} \;
grep -rl --include="*.java" simplestring *
Salta find
e usa Spotlight
dalla riga di comando. Molto più potente!
SPOTLIGHT DELLA COMANDO - TROVA INCONTRA GREP
Molte persone non sanno che puoi eseguire ricerche Spotlight dalla riga di comando. Perché ricordare tutte le opzioni di ricerca e grep arcane e cosa no quando puoi lasciare che Spotlight faccia il lavoro per te. L'interfaccia della riga di comando di Spotlight si chiama mdfind. Ha la stessa potenza della ricerca Spotlight della GUI e altro perché è programmabile dalla riga di comando!
Prova questo:
grep -rl "string" */*java
È inoltre possibile utilizzare un programma GUI come TextWrangler per effettuare una ricerca più intuitiva in cui le opzioni sono nell'interfaccia.
grep "(your string)" -rl $(find ./ -name "*.java")
Se si desidera ignorare case, sostituire -rl con -irl. (la tua stringa) può anche essere una regex se mai ne vedi la necessità.