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
-R
non 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 find
e xargs
per i dettagli.
-print0
dopo 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 find
e xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
L'uso di /dev/null
assicura la stampa dei nomi dei file; l' -print0
e -0
offerte 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 find
e 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 nullglob
evitare 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