¿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
-r
engrep
: busca recursivamente en la jerarquía de directorios actual;-F
engrep
: coincide con una cadena fija en lugar de con un patrón;-o
engrep
: imprime sólo coincidencias;-l
enwc
: 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 -R
bandera 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 -c
bandera genera grep
solo 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 -c
modificador de grep para contar las ocurrencias:
$ grep -rFoc foo
file1:3
dir/file2:3