Soluzione 1:
Potresti usare grep:
grep -rn 'classname' /path/to/source
Questo stamperà anche il numero di riga accanto a ogni corrispondenza.
Senza distinzione tra maiuscole e minuscole:
grep -rin 'classname' /path/to/source
Cerca in modo non ricorsivo in tutti i file cpp:
grep -n 'classname' /path/to/source/*.cpp
Soluzione 2:
Tutte le risposte di cui sopra funzioneranno perfettamente, ma potrebbero causare falsi positivi se hai la stringa in qualcosa di più del semplice codice sorgente. Supponiamo che tu stia cercando dove usi la classe FooBar in un progetto java, puoi cercare tutti i file denominati *.java e grep solo quelli.
# grep "FooBar" -Hn $(find -name "*.java")
La sezione tra $() si espanderà all'output di quel comando. Il -H stampa il nome del file. È l'impostazione predefinita in cui è presente più di un nome di file, ma lo aggiungiamo esplicitamente qui nel caso in cui l'espansione restituisca solo un nome di file. Il -n stampa il numero di riga della corrispondenza.
Funzionerà per piccoli progetti, ma se hai a che fare con un progetto più grande, c'è la possibilità che find si espanda a una stringa più lunga del limite della riga di comando. È quindi più sicuro usare:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn
xargs prenderà l'input dallo standard in e lo dividerà in modo che si adatti alla riga di comando, eseguendo il comando più volte se necessario. I -print0 e -0 sono necessari per gestire file con spazi nel nome.
Puoi anche cercare tutti i nomi di file con una corrispondenza usando:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l
Il -l visualizzerà solo il nome del file e smetterà di cercare in un particolare file non appena trova una corrispondenza.
Se farai spesso questo genere di cose, potresti voler guardare uno strumento come ctags o tag esuberanti, che mantengono un indice di ricerca del tuo codice sorgente e possono rispondere rapidamente a questo tipo di domande. Sia vim che emacs supportano questi strumenti. Potresti anche dare un'occhiata a un IDE come Eclipse, che può fare molto bene i riferimenti incrociati.
(So che stavi cercando una definizione di classe, ma in Java una classe sarà definita in un file con lo stesso nome della classe. Se stavi facendo cpp, potresti fare qualcosa del tipo:
# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
xargs -0 egrep "class\s+FooBar" -Hn
Soluzione 3:
Per la ricerca nel codice sorgente, ho scoperto che ack (betterthangrep.com) è, per citare il marketing, migliore di grep. Il suo output è più facile da leggere e farà molte cose automaticamente, come ignorare i file di codice non sorgente:directory VCS (ad es. CVS e .svn), file di backup.
Soluzione 4:
ack è migliore per la ricerca di codici sorgente poiché riconosce già alcune delle estensioni di file più popolari (c, perl, ecc.). È veloce come grep e per impostazione predefinita ignora tutti i tuoi artefatti di controllo della versione. Ad esempio, se vuoi cercare un codice sorgente perl di pattern che potresti usare
ack --perl pattern
invece di
grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)