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.