2010-09-24 9 views

Respuesta

27
find/-type f -name filename.ext -exec grep -l 'lookingfor' {} + 

El uso de un + para terminar el comando es más eficiente que \; porque find envía un lote de archivos a grep en lugar de enviarlos uno por uno. Esto evita un fork/exec para cada archivo individual que se encuentra.

Hace un tiempo hice algunas pruebas para comparar el rendimiento de xargs vs vs {} +{} \; y me pareció que era más rápido {} +. Éstos son algunos de mis resultados:

time find . -name "*20090430*" -exec touch {} + 
real 0m31.98s 
user 0m0.06s 
sys  0m0.49s 

time find . -name "*20090430*" | xargs touch 
real 1m8.81s 
user 0m0.13s 
sys  0m1.07s 

time find . -name "*20090430*" -exec touch {} \; 
real 1m42.53s 
user 0m0.17s 
sys  0m2.42s 
+0

Solo agregaría '--color' a' grep', creo que es mucho más fácil ver las cosas. En realidad, me acabo de dar cuenta de que no toma el alias que definí en '.bashrc'. – Alexandre

1

Probar:

find/-type f -name filename.ext -exec grep -H -n 'lookingfor' {} \; 

find búsquedas de forma recursiva a partir de la raíz / archivos con el nombre filename.ext y para cada ocurrencia encontrado que funciona grep en el nombre del archivo en busca de lookingfor y si las impresiones se encuentran el número de línea (-n) y el nombre del archivo (-H).

+0

Dado el enorme número de archivos , es mucho más eficiente usar 'xargs' que comenzará' grep' solo una vez, como en la respuesta de digen. –

3

A más sencillo sería,

find/-type f -name filename.ext -print0 | xargs -0 grep 'lookingfor' 

-print0 para encontrar & 0 a xargs podría mitigar el problema del gran número de archivos en un solo directorio.

+1

'-print0' y' -0' no tiene nada que ver con la gran cantidad de archivos. Asegura que 'encontrar | xargs' funciona cuando algunos archivos tienen caracteres espaciales en sus nombres. –

+0

Didier tiene toda la razón en esto, aquí está el extracto de la página del manual para todos los demás, -print0 Verdadero; imprime el nombre del archivo completo en la salida estándar, seguido por un carácter nulo (en lugar del carácter de nueva línea que utiliza -print). Esto permite nombres de archivo que contienen nuevas líneas u otros tipos de espacio en blanco para ser interpretado correctamente por pro- gramos que procesan la salida hallazgo. Esta opción corresponde a la opción -0 de xargs. – digen

6

Ir al directorio correspondiente y escriba el siguiente comando.

hallazgo. -name "* .ext" | xargs grep 'lookingfor'

0

encuentro el siguiente comando de la forma más sencilla:

grep -R --include="filename.ext" lookingfor 

o añadir -i para buscar entre mayúsculas y minúsculas:

grep -i -R --include="filename.ext" lookingfor 
Cuestiones relacionadas