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?

Estrelas do mar
fonte

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.

Lobo
fonte
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
abanar
fonte
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.

Jan Persson
fonte
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.
l0b0
fonte