2008-10-09 11 views

Respuesta

24
grep -r REGEX . 

Reemplace . con el directorio desde el que desee buscar.

+1

Advertencia, -r sólo funciona con algunas versiones de grep. –

+3

Como usted pregunta por "la mejor" manera, creo que no debería haber aceptado esta respuesta, sino la de Chas. Esta no es la mejor respuesta porque '-r' no es portátil. La mejor respuesta es la que es portátil, trata con personajes divertidos en los nombres de archivo y solo crea un puñado de procesos en el peor de los casos. Este sería el hallazgo de Chas. -type f -print0 | xargs -0 grep pattern'. Completamente POSIX y tan a prueba de balas como sea posible. – Jens

+3

@Jens: Como te gusta ser pedante, 1. 'xargs -0' no fue portátil durante mucho tiempo, y 2. Chas, no Chas '(los nombres de las personas nunca se consideran plurales). –

3

grep -r si está utilizando GNU grep, que viene con la mayoría de las distribuciones de Linux.

En la mayoría de los UNIXes no está instalado de forma predeterminada para probar esto en su lugar:

hallazgo. -type f | xargs grep expresiones regulares

3

Si utiliza el shell zsh puede utilizar

grep REGEX **/* 

o

grep REGEX **/*.java 

Esto puede perder fuerza si hay demasiados archivos coincidentes.

La manera canónica es utilizar Find con el ejecutivo.

find . -name '*.java' -exec grep REGEX {} \; 

o

find . -type f -exec grep REGEX {} \; 

El 'tipo f' bit sólo significa el tipo de archivo y coincidirá con todos los archivos.

7

Este es uno de los casos en los que he empezado a utilizar ACK (http://petdance.com/ack/) en lugar de grep. Desde el sitio, puede obtener instrucciones para instalarlo como un componente CPAN de Perl, o puede obtener una versión autónoma que puede instalarse sin tener que lidiar con dependencias.

Además del hecho de que se utiliza de forma predeterminada para la búsqueda recursiva, le permite usar expresiones regulares de fuerza Perl, usar expresiones regulares para elegir archivos para buscar, etc. Tiene una impresionante lista de opciones. Recomiendo visitar el sitio y echarle un vistazo. Lo encontré extremadamente fácil de usar, y hay sugerencias para integrarlo con vi (m), emacs e incluso con TextMate si lo usa.

2

Sugiero cambiar la respuesta a:

grep REGEX -r .

El -r no indica expresión regular. Le dice a grep que recurse en el directorio provisto.

+0

La colocación de opciones después de los argumentos posicionales es una extensión de GNU. Algunos dirían que 'grep -r' es también una extensión de GNU, pero, aún así, suelo hacer un hábito de poner todas las opciones antes de los argumentos posicionales. –

10

* El método portátil de hacer esto es

find . -type f -print0 | xargs -0 grep pattern 

-print0 le indica a find a utilizar nuls ASCII como separador y -0 dice xargs la misma cosa. Si no los usa, obtendrá errores en los archivos y directorios que contienen espacios en sus nombres.

* a diferencia de grep -r, grep -R o grep --recursive que solo funciona en algunas máquinas.

+0

¿Cómo se protege su expresión regular del shell? –

+0

@FelipeAlvarez Simplemente citando correcciones la mayor parte del problema: 'grep 'f. * O" '. Lo único que debería expandirse en una cadena es algo que sigue a '$', así que escapé de '$' si es necesario, pero no puedo pensar en un patrón válido para grep que tenga cosas después de '$' (grep funciona en líneas y '$' significa fin de línea). –

+0

¿Qué sucede con los caracteres especiales del intérprete de comandos Después de que el shell elimine las comillas, se lo pasa a xargs? ¿Cómo afectará eso a grep después de eso? –

1

Esta es una gran manera de encontrar la expresión exacta de forma recursiva con uno o más tipos de archivos:

find . \\(-name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep (cotizaciones individuales internas)

Dónde

(cotizaciones de nuevo solo aquí)

-name '\''*.<filetype>'\'' -o

se repite en el paréntesis() para saber cuántos otros tipos de archivos desea agregar a su búsqueda recursiva

un alias se parece a esto en bash

alias fnd='find . \\(-name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

Cuestiones relacionadas