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?

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.


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

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.


¿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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.