Come posso usare grep per cercare nella directory corrente tutti i file contenenti la stringa "ciao" e visualizzare solo i file .h e .cc?
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:
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)
È possibile passare i caratteri jolly anziché specificare i nomi dei file o utilizzare stdin.
grep hello *.h *.cc
-Rnon funziona purtroppo. Si espande *prima di andare in modo ricorsivo.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".
Controllare le pagine del manuale per finde xargsper i dettagli.
-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.
find -exec +sintassi invece di xargs
-exec grep "hello" {} +dove la coppia di parentesi graffe rappresenta il nome del file. Buon consiglio
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.
find ... -exec grep "hello" {} +
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)$'`
grep -l hello **/*.{h,cc}
Potresti voler shopt -s nullglobevitare i messaggi di errore se non ci sono file .h o .cc.
Il modo più semplice: grep -Ril "Your text" /
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