
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 1
asegura 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 f
porque no desea grep
directorios.
Respuesta2
Encuentra la cantidad de archivos que contienen la palabra.zanahoria
number_of_files=`grep -l -r -i "carrot" . | wc -l`
Significado de los grep
argumentos:
-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 .