grep tutti i file .java in una directory per una stringa particolare


12

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.


Grazie per avermelo chiesto, quindi non devo. Ora devo solo capire come escludere ".git" e ho finito per un po '.
Dan Rosenstark,

Penso che la risposta di js sia più concisa, fa ancora schifo devi scrivere, compreso, ma comunque. Probabilmente potrebbe semplicemente scrivere un alias per nasconderlo
Craig Tataryn il

Risposte:


19

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.



11

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).


Puoi anche usare l'opzione "--replace" in xargs per gestire i nomi dei file che contengono spazi: ... | xargs - rimpiazza grep 'string' '{}' ({} verrebbe sostituito dal nome del file)
arathorn il

1
Le versioni moderne di find (incluso quello installato su OS X) supportano "-exec <command> {} +" dove il segno più alla fine (invece di \;) dice a find di sostituire {} con "quanti più percorsi possibili ... Questo è simile a quello di xargs (1) "(dalla pagina man).
Doug Harris,

7

Usa grep che è meglio di grep, ack :

ack -l --java  "string" 

3
ack non è installato su Mac OS X per impostazione predefinita.
John Topley,

Non so cosa significhi "per impostazione predefinita". Su molti sistemi operativi, scegli ciò che installi, quindi è difficile trovare programmi sempre presenti. Alla volta, un compilatore C era sempre lì e Perl era insolito ...
bortzmeyer,

1
Significa che fa parte dell'installazione standard del sistema operativo. Ho gli strumenti per sviluppatori installati sul mio Mac e non si installano correttamente. Devi installarlo tu stesso. Se ce l'hai, allora è una bella sintassi.
John Topley,

Nel caso di ack, è un singolo programma Perl senza dipendenze del modulo. Se puoi "installare" i programmi nella tua directory ~ / bin, allora puoi "installare" altrettanto facilmente.
Andy Lester,

4

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" {} \;


3
grep -rl --include="*.java" simplestring *

1
Questa sembra essere la risposta migliore qui - se grep fa tutto, perché usare find & xargs?
Peter Gibson,

Cordiali saluti, dato ciò che è stato posto nella domanda, dovrebbe essere piccola "l" non grande "L" in quel comando
Craig Tataryn,

Craig ha ragione, ho corretto la mia risposta.
js.

1

Poiché questa è una domanda OSX, ecco una risposta più specifica per OSX.

Salta finde usa Spotlightdalla 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!


0

Prova questo:

grep -rl "string" */*java

1
Questo dà "grep: * / * java: nessun file o directory simile" su Mac OS X.
John Topley,

Il problema qui è che troverà solo i file * .java a un livello di profondità. Vedi la risposta di Mark Thalman per IMHO il modo corretto di farlo.
Ludwig Weinzierl,

Spiacente, non sul mio Mac. La versione Mac di grep non ha il flag -r (ricorsivo)?
dwj,

Lo fa, ma quello era l'output che ho ottenuto quando cercavo una stringa che so fosse nei file.
John Topley,

0

È inoltre possibile utilizzare un programma GUI come TextWrangler per effettuare una ricerca più intuitiva in cui le opzioni sono nell'interfaccia.


0
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à.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.