Come posso usare grep per cercare nella directory corrente tutti i file che hanno una stringa “hello” ma visualizzano solo i file .h e .cc?


139

Come posso usare grep per cercare nella directory corrente tutti i file contenenti la stringa "ciao" e visualizzare solo i file .h e .cc?

Risposte:


161
grep -r --include=*.{cc,h} "hello" .

Questo dice: cerca ricorsivamente (anche in tutte le sottodirectory) tutti i file .cc OR .h che contengono "ciao" in questa .directory (corrente)

Da un'altra domanda di StackOverflow


5
Nel post originale hai detto "directory corrente" e nulla di averne bisogno ricorsivamente o in sottodirectory (mi rendo conto che l'hai menzionato in un post successivo). Per quelli interessati a come farlo solo nella directory corrente, è grep -si "hello" --include=*.{cc,h} ./* ./.*(cerca anche i file nascosti). Ecco una versione generica per cercare una stringa in tutti i file / nascosti: grep -s "hello" * .*. Forse più generalmente utile (e più semplice), questo cerca tutti i file non nascosti per "ciao": grep -si "hello" ./* Grazie a questo post: askubuntu.com/a/777456
jbobbins,

1
grep -r --include=*.{java,py} "hello" .

Per qualche motivo questo non funziona su macOS, anche quando si utilizza l'utilità grep GNU.
xApple

49

È possibile passare i caratteri jolly anziché specificare i nomi dei file o utilizzare stdin.

grep hello *.h *.cc

Ho bisogno anche di tutte le sottodirectory
StackOverflow

L'aggiunta -Rnon funziona purtroppo. Si espande *prima di andare in modo ricorsivo.
Donald Miner,

La risposta di Noufal è ciò che stai cercando se hai bisogno di sottodirectory
Donald Miner,

8
@Jammin Dovresti essere chiaro su questo quando fai la domanda. Questa risposta è la risposta "corretta" alla domanda dichiarata.
Giordania,

$ grep -R hello *# trova da tutte le parole contiene ciao (inclusa la sottodirectory)

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Controllare le pagine del manuale per finde xargsper i dettagli.


1
Devi avere un -print0dopo il '*.cc', altrimenti non hai un'azione per quella parte della ricerca. Oppure è necessario inserire parentesi in là: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler,

Grazie per averlo notato. Ho modificato la risposta per "aggiustarla".
Noufal Ibrahim,

3
Puoi anche usare la find -exec +sintassi invece di xargs
jordanm

@jordanm: Sì: -exec grep "hello" {} +dove la coppia di parentesi graffe rappresenta il nome del file. Buon consiglio
Jonathan Leffler,

10

Per cercare ricorsivamente nella directory corrente:

grep -r 'myString' .

5

Se hai bisogno di una ricerca ricorsiva, hai una varietà di opzioni. Dovresti considerare ack.

In caso contrario, se si dispone di GNU finde xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

L'uso di /dev/nullassicura la stampa dei nomi dei file; l' -print0e -0offerte con i nomi di file contenenti spazi (nuove righe, ecc).

Se non hai nomi ostili (con spazi ecc.), Puoi usare:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Questo potrebbe prendere alcuni nomi che non intendevi, perché la corrispondenza del modello è più fuzzi (ma più semplice), ma per il resto funziona. E funziona con versioni non GNU di finde xargs.


nota che puoi anche direfind ... -exec grep "hello" {} +
fedorqui "COSÌ smetti di danneggiare" il

5

Se leggo attentamente la tua domanda, chiedi a "grep di cercare nella directory corrente tutti i file contenenti la stringa" ciao "e visualizzare solo i file .h e .cc". Quindi per soddisfare i tuoi precisi requisiti ecco la mia richiesta:

Questo visualizza i nomi dei file:

grep -lR hello * | egrep '(cc|h)$'

... e questo mostra i nomi e i contenuti dei file:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

Potresti voler shopt -s nullglobevitare i messaggi di errore se non ci sono file .h o .cc.


4
So usare google ecc. L'ho chiesto qui perché diverse risposte hanno "-l" ed è bello avere tutte le informazioni in un unico posto.
Andrew Swift,

-l ("el" minuscolo) Elimina l'output normale. Stampa il nome di ciascun file di input dal quale normalmente sarebbe stato stampato l'output. La scansione / ricerca si interromperà alla prima corrispondenza.
Rex CoolCode Charles,

-1

Il modo più semplice: grep -Ril "Your text" /


1
Questo non mostra solo i file .h o .cc ed è utile spiegare quali opzioni hai usato e perché.
kon psych il
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.