Comment comptez-vous chaque occurrence d'un terme dans tous les fichiers du répertoire actuel? - et sous-répertoires (?)
J'ai lu que pour faire cela, vous utiliseriez grep
; quelle est la commande exacte?
Aussi, est-il possible de ce qui précède avec une autre commande?
Utiliser grep
+ wc
(cela permettra de gérer plusieurs occurrences du terme sur la même ligne):
grep -rFo foo | wc -l
-r
in grep
: recherche récursivement dans la hiérarchie de répertoires en cours;-F
in grep
: correspond à une chaîne fixe plutôt qu'à un modèle;-o
in grep
: imprime seulement les correspondances;-l
in wc
: affiche le nombre de lignes;% 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
grep -Rc [term] *
le fera. L'indicateur -R
signifie que vous souhaitez effectuer une recherche récursive dans le répertoire en cours et dans tous ses sous-répertoires. *
est un sélecteur de fichier qui signifie: tous les fichiers. L'indicateur -c
fait que grep
ne génère que le nombre d'occurrences. Toutefois, si le mot apparaît plusieurs fois sur une même ligne, il n'est compté qu'une seule fois.
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 vous n'avez pas de liens symboliques dans votre répertoire, il n'y a pas de différence.
En tant que variante de la réponse Nice de @ kos, si vous souhaitez détailler les nombres, vous pouvez utiliser le commutateur -c
de grep pour compter les occurrences:
$ grep -rFoc foo
file1:3
dir/file2:3
Dans un petit script 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)
count_string.py
.Exécutez-le à partir du répertoire avec la commande:
python3 /path/to/count_string.py <term>
# 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)