Contando as ocorrências de caractere em uma árvore do sistema de arquivos

0

A tarefa era encontrar o número de ocorrências do caractere 'a' em todos os arquivos no diretório (recursivamente).

Meu script foi este

find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l

mas falhou: recebi o resultado 0 mesmo no meu computador local funcionou.

O que há de errado com esse script? Eu acho que não é à prova de balas ou algo assim. Como eu poderia torná-lo à prova de balas ou correto?

    
por trolkura 18.02.2016 / 17:48

2 respostas

1

Meu palpite é que grep da máquina problemática não suporta -o.

Se esse for o caso, sua linha de comando gerará uma mensagem de erro sempre find execs grep . No entanto, com o erro padrão redirecionado para / dev / null, os gritos caem em ouvidos surdos.

wc não recebe um único byte, resultando em uma contagem de linha de 0, porque grep está saindo imediatamente.

Tente executar o pipeline sem um redirecionamento stderr ou com o redirecionamento para um arquivo de log. Se eu estiver correto, você deverá ver uma mensagem de erro por arquivo encontrada por find .

Caso você ache útil, veja uma alternativa que não usa grep :

find . -type f -exec cat {} \; | tr -cd a | wc -m

Se o seu find suportar a alternativa mais eficiente + exec:

find . -type f -exec cat {} + | tr -cd a | wc -m
    
por 18.02.2016 / 22:10
0

Eu fiz isso:

find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l

que é praticamente o mesmo que o seu comando e obteve um resultado diferente de zero. Você está no diretório que você pensou que fosse? E você está realmente procurando por a ? Se não, sugiro grep -F (como eu usei) ou fgrep , para procurar uma string fixa em vez de um regexp.

Você pode simplificar ainda mais com grep -r (grep recursivo):

grep -Fro 'a' "${directory-.} | wc -l

Infelizmente, você não pode obter grep para fazer a contagem, pois grep -o -c conta linhas em vez de ocorrências - considero isso um bug.

    
por 18.02.2016 / 18:29

Tags