GNU/Linux >> Tutoriales Linux >  >> Linux

Buscando una cantidad de archivos para una cadena en LInux

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)

Linux
  1. Cómo aumentar el número de límites de archivos abiertos en Linux

  2. ¿Número de archivos que contienen una cadena determinada?

  3. ¿Número máximo de archivos/directorios en Linux?

  4. Búsqueda de una cadena en varios archivos en Linux

  5. ¿Excluir archivos ocultos al buscar con Unix/Linux find?

Cómo copiar una gran cantidad de archivos en Linux

Linux busca cadenas en carpetas y archivos con ack

Encuentra texto en archivos en Linux usando grep

Contar el número de archivos en un directorio en Linux

Cómo contar el número de archivos en un directorio en Linux

Configuración de Dropbox para un servidor en la nube de Linux