GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo combinar find y grep para una búsqueda compleja? (GNU/linux, buscar, grep)

Prueba

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Esto debería buscar recursivamente las carpetas bajo application para archivos con .php extensión y pásalos a grep .

Una optimización de esto sería ejecutar:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Esto usa xargs para pasar todos los .php salida de archivos por find como argumentos para un solo grep comando; por ejemplo, grep "debug (" file1 file2 file3 . El -print0 opción de find y -0 opción de xargs asegúrese de que los espacios en los nombres de archivos y directorios se manejen correctamente. El -H opción pasada a grep asegura que el nombre del archivo se imprima en todas las situaciones. (Por defecto, grep imprime el nombre del archivo solo cuando se pasan varios argumentos).

De man xargs:

-0

      Los elementos de entrada terminan con un carácter nulo en lugar de un espacio en blanco, y las comillas y la barra diagonal inversa no son especiales (cada carácter se toma literalmente). Deshabilita la cadena de fin de archivo, que se trata como cualquier otro argumento. Útil cuando los elementos de entrada pueden contener espacios en blanco, comillas o barras invertidas. El GNU encuentra -print0 La opción produce una entrada adecuada para este modo.


find ni siquiera es necesario para este ejemplo, uno puede usar grep directamente (al menos GNU grep ):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

y estamos reducidos a una sola bifurcación de proceso.

Opciones:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

Linux
  1. Cómo usar el comando 'buscar' para buscar varios nombres de archivo (extensiones) en Linux

  2. Cómo encontrar y matar el proceso Zombie en Linux

  3. ¿Cómo buscar archivos por tamaño y extensión?

  4. Cómo encontrar texto específico usando GREP en Linux

  5. Linux busca la palabra y muestra la línea completa

Cómo usar el comando grep en Linux/UNIX

Cómo encontrar una cadena en un archivo en Linux

Cómo encontrar y eliminar enlaces simbólicos rotos en Linux

Cómo buscar archivos desde la línea de comandos de Linux

Cómo encontrar y eliminar directorios vacíos en Linux

Cómo encontrar el nombre y la versión de la versión de distribución de Linux