Con find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
es 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 f
con el específico de GNU ! -xtype d
( -xtype d
coincidencias 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 read
opción. Sin grep
embargo, las versiones recientes de GNU aún no buscarán dentro de enlaces simbólicos.
Las versiones muy antiguas de GNU find
no 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 greps
podría ayudar. Puede hacerlo con xargs
la -P
opció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 -n1000
para generar un nuevo grep
cada 1000 archivos, hasta 3 que se ejecutan en paralelo a la vez).
Sin embargo, tenga en cuenta que si la salida de grep
se redirige, terminará con una salida mal entrelazada de los 3 grep
procesos, 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-buffered
opción de GNU grep
.
Si pattern
es una cadena fija, agregar la -F
opció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.
find
conxargs
ogrep -R