¿Cómo encontrar y contar cuántos archivos contienen una determinada palabra?

¿Cómo encontrar y contar cuántos archivos contienen una determinada palabra?

Se supone que debo buscar y mostrar el recuento de la cantidad de archivos que contienen la palabra zanahoria (se ignoran mayúsculas y minúsculas)

Hasta ahora esto es lo que tengo, pero no estoy seguro de cómo agregarle el wc para contar cuántos archivos hay que tienen la palabra zanahoria.

encontrar . -exec grep -i zanahoria {} \;

Respuesta1

En primer lugar, como han dicho otros, no hay razón para usar find, solo use recursivo grep:

grep -irm 1 carrot . | wc -l 

El -m 1asegura quegrep dejará de buscar cada archivo después de la primera coincidencia. Sin él, no estás contando el número dearchivosque contienencarrot pero el número delíneas, el mismo archivo se contará varias veces si contiene varias instancias de carrot. De man grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)
   -m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Si realmente quieres hacerlo con find, puedes hacerlo

find . -type f -exec grep -im 1 carrot {} \; | wc -l

Tenga en cuenta que lo estoy especificando -type fporque no desea grepdirectorios.

Respuesta2

Encuentra la cantidad de archivos que contienen la palabra.zanahoria

number_of_files=`grep -l -r -i "carrot" . | wc -l`

Significado de los grepargumentos:

-l, --files-with-matches
         Only the names of files containing selected lines are written to standard output.  grep will only search a file until a match has been found, making
         searches potentially less expensive.  Pathnames are listed once per file searched.  If the standard input is searched, the string ``(standard
         input)'' is written.

-R, -r, --recursive
         Recursively search subdirectories listed.

-i : case insenstive

wc -l: imprime el número de líneas pasadas como entrada al programa. En nuestro caso, estas líneas son los nombres de archivos con un patrón de entrada coincidente encontrado por grep.

Imprimir la salida

echo $number_of_files

Respuesta3

Una variante de la solución de smRaj sería una doble invocación de grep. Lo siguiente daría el mismo resultado quegrep[etc.]| baño -l:

grep -l -r -i "carrot" . | grep -c .

Lo siguiente imprimiría una lista numerada de los archivos que contienen la palabra buscada.

grep -l -r -i "carrot" . | grep -n .

información relacionada