¿Cómo contaría cada aparición de un término en todos los archivos del directorio actual?

¿Cómo contaría cada aparición de un término en todos los archivos del directorio actual?

¿Cómo contaría cada aparición de un término en todos los archivos del directorio actual? - y subdirectorios(?)

He leído que para hacer esto usarías grep; ¿Cuál es el comando exacto?

Además, ¿es posible lo anterior con algún otro comando?

Respuesta1

Usando grep+ wc(esto atenderá múltiples apariciones del término en la misma línea):

grep -rFo foo | wc -l
  • -ren grep: busca recursivamente en la jerarquía de directorios actual;
  • -Fen grep: coincide con una cadena fija en lugar de con un patrón;
  • -oen grep: imprime sólo coincidencias;
  • -len wc: imprime el recuento de líneas;
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8

Respuesta2

grep -Rc [term] *lo haré. La -Rbandera significa que desea buscar recursivamente en el directorio actual y en todos sus subdirectorios. Es *un selector de archivos que significa: todos los archivos. La -cbandera genera grepsolo el número de ocurrencias. Sin embargo, si la palabra aparece varias veces en una sola línea, se cuenta sólo una vez.

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.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

Si no tiene enlaces simbólicos en su directorio, no hay diferencia.

Respuesta3

En un pequeño script de Python:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • Guárdalo como count_string.py.

  • Ejecutarlodel directoriocon el comando:

      python3 /path/to/count_string.py <term>
    

Notas

  • Si el término incluye espacios, utilice comillas.
  • Cuenta cada aparición del término de forma recursiva, también si aparecen varias apariciones en una línea.

Explicación:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)

Respuesta4

Como variante de la buena respuesta de @kos, si está interesado en detallar los recuentos, puede usar el -cmodificador de grep para contar las ocurrencias:

$ grep -rFoc foo
file1:3
dir/file2:3

información relacionada