web-dev-qa-db-fra.com

Comment comptez-vous chaque occurrence d'un terme dans tous les fichiers du répertoire actuel?

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?

10
TellMeWhy

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
12
kos

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.

8
Jos

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
2
emacs_ftw

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)
  • Enregistrez-le sous count_string.py.
  • Exécutez-le à partir du répertoire avec la commande:

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

Remarques

  • Si le terme inclut des espaces, utilisez des guillemets.
  • Il compte chaque occurrence du terme de manière récursive, même s'il y a plusieurs occurrences dans une ligne.

Explication:

# 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)
2
Jacob Vlijm