Solución 1:
Podrías usar grep:
grep -rn 'classname' /path/to/source
Esto también imprimirá el número de línea junto a cada coincidencia.
Insensible a mayúsculas y minúsculas:
grep -rin 'classname' /path/to/source
Buscar de forma no recursiva en todos los archivos cpp:
grep -n 'classname' /path/to/source/*.cpp
Solución 2:
Todas las respuestas anteriores funcionarán perfectamente bien, pero pueden causar falsos positivos si tiene la cadena en algo más que el código fuente. Digamos que está buscando dónde usa la clase FooBar en un proyecto java, puede buscar todos los archivos llamados *.java y grep solo esos.
# grep "FooBar" -Hn $(find -name "*.java")
La sección entre $() se expandirá a la salida de ese comando. El -H imprime el nombre del archivo. Es el valor predeterminado donde hay más de un nombre de archivo, pero lo agregamos explícitamente aquí en caso de que la expansión solo devuelva un nombre de archivo. La -n imprime el número de línea de la coincidencia.
Esto funcionará para proyectos pequeños, pero si se trata de un proyecto más grande, existe la posibilidad de que la búsqueda se expanda a una cadena más larga que el límite de la línea de comando. Por lo tanto, es más seguro usar:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn
xargs tomará la entrada de la entrada estándar y la dividirá para que quepa en la línea de comando, ejecutando el comando varias veces si es necesario. Se requieren -print0 y -0 para manejar archivos con espacios en su nombre.
También puede buscar todos los nombres de archivos que coincidan usando:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l
El -l solo mostrará el nombre del archivo y dejará de buscar en un archivo en particular tan pronto como encuentre una coincidencia.
Si va a hacer este tipo de cosas con frecuencia, es posible que desee ver una herramienta como ctags o etiquetas exuberantes, que mantienen un índice de búsqueda de su código fuente y pueden responder este tipo de preguntas rápidamente. Tanto vim como emacs tienen soporte para estas herramientas. También le puede interesar ver un IDE como Eclipse, que puede hacer referencias cruzadas muy bien.
(Sé que estaba buscando una definición de clase, pero en Java una clase se definirá en un archivo con el mismo nombre que la clase. Si estuviera haciendo cpp, podría hacer algo como:
# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
xargs -0 egrep "class\s+FooBar" -Hn
Solución 3:
Para buscar a través del código fuente, descubrí que ack (betterthangrep.com) es, para citar el marketing, mejor que grep. Su salida es más fácil de leer y hará muchas cosas automáticamente, como ignorar archivos que no sean de código fuente:directorios VCS (por ejemplo, CVS y .svn), archivos de copia de seguridad.
Solución 4:
ack es mejor para buscar códigos fuente ya que reconoce algunas de las extensiones de archivo más populares (c, perl, etc.). Es tan rápido como grep y, de forma predeterminada, ignora todos los artefactos de control de versiones. Por ejemplo, si desea buscar algún patrón de código fuente de Perl, podría usar
ack --perl pattern
en lugar de
grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)