Como você contaria cada ocorrência de um termo em todos os arquivos do diretório atual?

Como você contaria cada ocorrência de um termo em todos os arquivos do diretório atual?

Como você contaria cada ocorrência de um termo em todos os arquivos do diretório atual? - e subdiretórios (?)

Eu li que para fazer isso você usaria grep; qual é o comando exato?

Além disso, é possível fazer o que foi dito acima com algum outro comando?

Responder1

Usando grep+ wc(isso atenderá a múltiplas ocorrências do termo na mesma linha):

grep -rFo foo | wc -l
  • -rin grep: pesquisa recursivamente na hierarquia de diretórios atual;
  • -Fin grep: corresponde a uma string fixa em vez de a um padrão;
  • -oin grep: imprime apenas correspondências;
  • -lin wc: imprime a contagem das linhas;
% 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

Responder2

grep -Rc [term] *farei isso. O -Rsinalizador significa que você deseja pesquisar recursivamente o diretório atual e todos os seus subdiretórios. É *um seletor de arquivos que significa: todos os arquivos. O -csinalizador gera grepapenas o número de ocorrências. Entretanto, se a palavra ocorrer várias vezes em uma única linha, ela será contada apenas uma 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.

Se você não tiver links simbólicos em seu diretório, não há diferença.

Responder3

Em um pequeno 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)
  • Salve-o como count_string.py.

  • Executá-lodo diretóriocom o comando:

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

Notas

  • Se o termo incluir espaços, use aspas.
  • Conta cada ocorrência do termo recursivamente, mesmo se houver múltiplas ocorrências em uma linha.

Explicação:

# 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)

Responder4

Como uma variante da boa resposta de @kos, se você estiver interessado em discriminar as contagens, poderá usar a -copção grep para contar ocorrências:

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

informação relacionada