5 votos

Buscar un número de archivos para una cadena en LInux

¿Cómo buscar archivos, algunos de los cuales podrían ser directorios (en este caso de forma recursiva) para una cadena dada?

Me gustaría buscar archivos de código fuente para una definición de clase, por lo que también sería genial si existiera el nombre del archivo que contiene antes de cada cadena de salida.

8voto

Usted podría utilizar grep:

grep -rn 'classname' /path/to/source

Esto también mostrará el número de línea junto a cada partido.

Caso insensible:

grep -rin 'classname' /path/to/source

La búsqueda no-recursiva en todos los archivos cpp:

grep -n 'classname' /path/to/source/*.cpp

4voto

David Pashley Puntos 17011

Todas las respuestas anteriores funcionará perfectamente bien, pero puede causar falsos positivos, si se tiene la cadena en más de código fuente. Digamos que usted está buscando cuando usted utiliza el FooBar clase en un proyecto java, usted puede buscar todos los archivos con nombre *.java y grep sólo eso.

# grep "FooBar" -Hn $(find -name "*.java")

La sección entre el $() se expanda a la salida de ese comando. La-H imprime el nombre del archivo. Es el valor predeterminado donde hay más de un nombre de archivo, pero de forma explícita que agregar aquí en caso de que la expansión sólo devuelve un nombre de archivo. La-n imprime el número de la línea del partido.

Esto funcionará para proyectos pequeños, pero si usted está tratando con un proyecto más grande, existe el potencial para el hallazgo a ampliar a una cadena de más de la línea de comandos límite. Por lo tanto, es más seguro utilizar:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn

xargs tendrá entrada estándar y dividirlo por lo que encaja en la línea de comandos, ejecute el comando varias veces si es necesario. El-print0 y -0 están obligados a tratar con archivos con espacios en el nombre.

También puede buscar por todas las filesnames con un partido en el uso de:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

La opción-l se acaba de mostrar el nombre de archivo y dejar de buscar en un archivo en particular tan pronto como se encuentra una coincidencia.

Si usted va a estar haciendo este tipo de cosas con frecuencia, es posible que desee ver en una herramienta como ctags, o exuberante etiquetas, que mantienen un índice de búsqueda de su código fuente y puede responder a este tipo de preguntas rápidamente. Ambos vim y emacs tiene soporte para estas herramientas. También puede buscar en un IDE como eclipse, que puede hacer referencia cruzada muy bien.

(Yo sé que usted estaba buscando una definición de clase, pero en Java una clase se define en un archivo con el mismo nombre que la clase. Si estaban haciendo cpp, se 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

2voto

Gavin Brown Puntos 58

Para buscar a través de código fuente, he encontrado que ack (betterthangrep.com) es, para citar a la comercialización, mejor que grep. Su salida es más fácil de leer y que va a hacer un montón de cosas automáticamente, como haciendo caso omiso de los archivos de código fuente no: directorios de VCS (por ejemplo CVS y SVN), copia de seguridad de archivos.

2voto

digiguru Puntos 3305

ACK es mejor para buscar códigos fuente, ya que reconoce algunas de la extensión de archivo más popular (c, perl, etc.). Es tan rápido como grep y haciendo caso omiso de todos sus artefactos de control de versión predeterminada. Por ejemplo, si desea buscar algún código de fuente de perl patrón que se puede utilizar

ack --perl pattern

En lugar de

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

0voto

mas Puntos 589
grep -r string *

encuentra todos los archivos que contiene los caracteres "cuerda" en todos los archivos (no ocultos) en el directorio actual y todos sus subdirectorios recursivamente. Puede utilizar el habitual regexes para sintonizar la cadena. Consulte las páginas de información/man grep para más opciones.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: