Búsqueda de cadenas: encontrar y grep y?

1

Tarea:
1) encontrar una cadena 'decor' dentro de los archivos en un directorio
2) obtener el número de ocurrencias para la decoración de cada archivo que lo tenga

La primera parte del problema se resuelve parcialmente con find . -type f | grep -i decor *
Pero esto no parece grep para todos los archivos que se encuentran desde find sino más bien lo que está encima del directorio actual.
¿Tengo que usar algo que no sea * para grep grep para archivos encontrados desde encontrar?

¿Qué se debe canalizar para que se muestre con un nombre de archivo y la cantidad de incidencias para la decoración de cada archivo?

ealeon
fuente

Respuestas:

2

Tu puedes hacer:

find . -type f -exec grep -icH decor {} \; | grep -v :0\$

Esto obtendrá el nombre de archivo y el recuento de cada coincidencia y eliminará los archivos con un recuento de 0 utilizando el egrep canalizado

arco444
fuente
¡No hay problema! Sin embargo, tenga en cuenta la edición, sin los dos puntos, ignorará cualquier número que termine en 0, por lo que 10, 100, etc.
arco444
Solo por el gusto de hacerlo, y mucho más allá del alcance de este ejercicio, emití un find2perl . -type f -exec grep -icH {} \; para ver si estoy dispuesto a agregar el grep -v: 0 \ $ parte. Parece factible, tal vez más tarde durante Jeopardy.
Billy McCloskey
2

"Archivos en un directorio" no suele significar "y los subdirectorios iside recursivamente". Yo solo usaría

grep -c decor *

Si también necesita buscar subdirectorios, puede usar buscar, pero conectar los comandos de forma diferente: la tubería simplemente conecta la salida del primer comando a la entrada del segundo. Sin embargo, Grep no espera una lista de archivos en su entrada.

find . -type f -exec grep -cH decor {} + | grep -v :0
choroba
fuente
0

Puede utilizar la opción -exec. find . -type f -exec grep decor {} \;

o usa xargs find . -type f | xargs -i grep decor {}

TheSAS
fuente
-1: i) esto rompe los nombres de archivo con espacios en blanco y ii) ninguna de las soluciones devuelve el número de coincidencias decor que es lo que pidió el OP.
terdon
0

TMTOWTDI - Me gusta ver las otras variantes, así que aquí está la mía también:

$ find . -type f -exec egrep -li decor {} \;

$ perl -e '$c=0; while(<>){$c++ if /decor/;} continue {if(eof){print("$ARGV:$c\n"); close ARGV; $c=0;} }' *

Solo porque sentí ganas de volver a escribir un Perl 1-liner que funciona igual que un viejo awk ejemplo tomado de las páginas de Kernighan y Pike .

Billy McCloskey
fuente
TMTOWTDI - Suena como algo que vale la pena hacer. Nota la perl2find sugerencia no tan útil , arriba - sólo por diversión. Ya has resuelto mi respuesta, con la misma referencia. ¡Bravo!
Billy McCloskey
BTW - Eso while (& lt; & gt;) {} continuar {if (eof) {close ARGV;} El lenguaje vale la pena memorizar. Una vez más, ese lenguaje Perl es digno de memorización.
Billy McCloskey