Saltar al contenido

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

Solución:

Tratar

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

Esto debería buscar de forma recursiva las carpetas bajo application para archivos con .php extensión y pasarlos a grep.

Una optimización sobre esto sería ejecutar:

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

Esto usa xargs pasar todo el .php archivos de salida por find como argumentos a un solo grep mando; p.ej, grep "debug (" file1 file2 file3. los -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. los -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 invertida no son especiales (cada carácter se toma literalmente). Desactiva el final de la cadena del archivo, que se trata como cualquier otro argumento. Útil cuando los elementos de entrada pueden contener espacios en blanco, comillas o barras diagonales inversas. El hallazgo de GNU -print0 La opción produce una entrada adecuada para este modo.

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

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

y nos quedamos con una única 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.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *