Número de archivos que contienen una cadena dada

19

¿Cómo puedo contar la cantidad de archivos (en un directorio) que contienen una cadena dada como entrada en bash / sh?

Estrella de mar
fuente

Respuestas:

30

grep -l "string" * | wc -l buscará "cadena" en el contenido de todos los archivos en el directorio de trabajo y le dirá cuántos coinciden.

Lobo
fuente
1
Esto no funcionará si hay muchos archivos en el directorio, arrojará el error "zsh: lista de argumentos demasiado larga: grep". ¿Alguna idea sobre cómo deshacerse de esto?
1
@ user16142 grep el directorio en lugar de los archivos: grep -lr "string" directory | wc -lsi no desea una búsqueda recursiva, puede usar la opción find con maxdepth: tenga en find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lcuenta que esta segunda opción es más lenta que grep.
Agargara
9

grepEl parámetro s -lsolo generará los nombres de archivo que coinciden $PATTERN, wcpuede contarlos después.

grep -l "$PATTERN" * | wc -l
meneo
fuente
gracias, pero me preguntaba con un patrón en el archivo ... perdón por la pregunta ambigua
Si es así, toma la respuesta de Wolf.
menea el
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Aclaración: Esto busca el número de archivos que tienen el "patrón_para_ver_para" en su contenido y no en sus nombres de archivo (como la respuesta de Wag). A partir de su pregunta, es difícil saber lo que está buscando.

Jan Persson
fuente
¿Pero falta algo? porque no funciona
Si busca el pato de cuerda, debe escribirlo como / duck / en Awk. Estas haciendo eso?
Jan Persson
sí, la salida: awk: error de lectura (es un directorio)
La respuesta de Wolf te dará duplicados. Si hay varias ocurrencias de la cadena que está buscando en uno de los archivos, contará como coincidencias adicionales.
Jan Persson
Bueno, si tiene directorios en la carpeta, tiene que hacer algunas cosas adicionales, como reemplazar la estrella con algo como esto find . ! -name . -prune -type f(no se pierda los backticks). Este comando solo enumera los archivos en la carpeta.
Jan Persson
2

Esto funciona en Bash con cualquier nombre de archivo:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Explicación:

  • grepLa -Zopción 'imprime cada resultado con un separador de ␀ bytes. Este carácter no puede ser parte del nombre de un archivo, por lo que simplemente podemos contar la cantidad de separadores para obtener la cantidad de archivos.
  • Para deshacernos de los otros caracteres en la salida, simplemente eliminamos todo excepto los ␀ bytes que usamos tr.
  • Luego solo cuenta los personajes con wc.
l0b0
fuente