Número de arquivos que contêm uma determinada sequência


18

Como posso contar o número de arquivos (em um diretório) que contêm uma determinada string como entrada no bash / sh?

Respostas:


29

grep -l "string" * | wc -l procurará por "string" no conteúdo de todos os arquivos no diretório ativo e informará quantas correspondências.


1
Isso não funcionará se houver muitos arquivos no diretório, gerará o erro "zsh: lista de argumentos muito longa: grep". Alguma idéia de como se livrar disso?

1
@ user16142 grep no diretório em vez dos arquivos: grep -lr "string" directory | wc -lse você não deseja pesquisa recursiva, pode usar a opção find com maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lObserve que esta segunda opção é mais lenta que o grep.
— Agargara

9

grepO parâmetro s -lproduzirá apenas os nomes de arquivos correspondentes $PATTERN, wcpodendo contá-los posteriormente.

grep -l "$PATTERN" * | wc -l

obrigado, mas estava me perguntando com um padrão no arquivo ... desculpa para a questão ambígua

Se sim, aceite a resposta de Wolf.
— wag

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Esclarecimento: procura o número de arquivos que possuem o "padrão_para_um_ aspeto" em seu conteúdo e não em seus nomes de arquivo (como a resposta de Wag). Da sua pergunta, é difícil dizer o que você está procurando.


Mas algo está faltando? porque ele não funciona

Se você procurar o pato de cordas, escreva-o como / duck / no Awk. Você está fazendo isso?
— Jan Persson

sim, a saída: awk: erro de leitura (é um diretório)

A resposta de Wolf lhe dará duplicatas. Se houver várias ocorrências da string que você está procurando em um dos arquivos, ela contará como correspondências extras.
— Jan Persson

Bem, se você tiver diretórios na pasta, precisará fazer algumas coisas extras, como substituir a estrela por algo assim find . ! -name . -prune -type f(não perca os backticks). Este comando lista apenas os arquivos na pasta.
— Jan Persson

2

Isso funciona no Bash com qualquer nome de arquivo:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Explicação:

  • grepA -Zopção 's' imprime todos os resultados com um separador de by bytes. Esse caractere não pode fazer parte de um nome de arquivo, portanto, podemos simplesmente contar o número de separadores para obter o número de arquivos.
  • Para se livrar dos outros caracteres na saída, simplesmente removemos tudo, exceto os bytes usando tr.
  • Depois basta contar os caracteres com wc.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.