Con find:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fes buscar solo en archivos normales (también excluyendo enlaces simbólicos incluso si apuntan a archivos normales). Si desea buscar en cualquier tipo de archivo excepto directorios (pero tenga cuidado, hay algunos tipos de archivos como fifos o / dev / zero que generalmente no desea leer), reemplace -type fcon el específico de GNU ! -xtype d( -xtype dcoincidencias para archivos de tipo directorio después de la resolución del enlace simbólico)).
Con GNU grep:
grep -r pattern /the/dir
(pero tenga en cuenta que a menos que tenga una versión reciente de GNU grep, seguirá los enlaces simbólicos cuando descienda a los directorios). No se buscarán archivos no regulares a menos que agregue una -D readopción. Sin grepembargo, las versiones recientes de GNU aún no buscarán dentro de enlaces simbólicos.
Las versiones muy antiguas de GNU findno admitían la {} +sintaxis estándar , pero allí podría usar la no estándar:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Es probable que las actuaciones estén vinculadas a E / S. Ese es el momento de hacer la búsqueda, sería el tiempo necesario para leer todos esos datos del almacenamiento.
Si los datos están en una matriz de discos redundante, leer varios archivos a la vez podría mejorar el rendimiento (y de lo contrario podría degradarlos). Si los rendimientos no están vinculados a E / S (porque, por ejemplo, todos los datos están en caché), y tiene varias CPU, la concurrencia también grepspodría ayudar. Puede hacerlo con xargsla -Popción de GNU .
Por ejemplo, si los datos están en una matriz RAID1 con 3 unidades, o si los datos están en caché y tiene 3 CPU cuyo tiempo de sobra:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(aquí se usa -n1000para generar un nuevo grepcada 1000 archivos, hasta 3 que se ejecutan en paralelo a la vez).
Sin embargo, tenga en cuenta que si la salida de grepse redirige, terminará con una salida mal entrelazada de los 3 grepprocesos, en cuyo caso es posible que desee ejecutarlo como:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(en un sistema GNU o FreeBSD reciente) o use la --line-bufferedopción de GNU grep.
Si patternes una cadena fija, agregar la -Fopción podría mejorar las cosas.
Si no se trata de datos de caracteres de varios bytes, o si coincide con ese patrón, no importa si los datos son de caracteres de varios bytes o no, entonces:
cd /the/dir &&
LC_ALL=C grep -r pattern .
podría mejorar el rendimiento significativamente.
Si terminas haciendo tales búsquedas con frecuencia, entonces puedes querer indexar tus datos usando uno de los muchos motores de búsqueda disponibles.
findconxargsogrep -R