Como faço para contar o número total de palavras de todos os arquivos em um diretório (e seus subdiretórios)?

3

Estou pensando que posso fazer isso com o wc de alguma forma, se houvesse uma opção recursiva, mas não tenho certeza. Eu quero um total geral do número total de palavras nos arquivos em um diretório e seus subdiretórios (não apenas uma contagem de palavras por arquivo).

Note que estou fazendo isso com o meu mac.

Ok, acabei de experimentar este comando

find enwiki/ -type f | xargs wc -w > output.txt

O arquivo de saída resultante possui 6425104 linhas, indicando muitos arquivos. Mas a contagem total de palavras no final foi de apenas 381609. Será que, talvez, o total geral de palavras contadas exceda o máximo permitido em bash? Não tenho certeza se isso aconteceu ou se eu usei wc incorretamente.

    
por Damonkashu 02.11.2011 / 07:45

3 respostas

11

Usando find para localizar todos os arquivos, concatenando-os com cat e contando as palavras no fluxo concatenado com wc :

find . -type f -print0 | xargs -0 cat | wc -w

O argumento -print0 para find é necessário se você tiver espaços em seus nomes de arquivos. Quando -print0 é usado com find , o -0 sinalizador deve ser usado com xargs .

    
por 02.11.2011 / 10:55
2

Se o seu wc tiver a opção --files0-from , você poderá fazer isso:

find . -type f -print0 | wc -w --files0-from=-

Explicação:

Encontrei esta solução lendo primeiro a página man wc (1) para ver quais opções estavam disponíveis para varrer vários arquivos. Eu encontrei isto:

--files0-from=F
       read input from the files specified by NUL-terminated names in file F;
       If F is - then read names from standard input

De usar find antes, sabia que poderia gerar a lista desejada de arquivos e, com a opção -print0 , exibir os arquivos como uma lista de nomes terminados com NULL.

Juntar isso resultou no comando acima. O comando find pesquisa o diretório atual ( . ) e todos os subdiretórios dos arquivos regulares ( -type f ) e imprime seus nomes de caminho completos na saída padrão, cada nome seguido por um caractere nulo em vez da nova linha usual ( -print0 ). Esse resultado é canalizado ( | ) para a entrada padrão de wc , que leu essa lista do arquivo especificado ( --files0-from= ), em que - significa a entrada padrão e imprime o número de palavras ( -w ) encontrados em cada arquivo seguido pelo total de todas as palavras encontradas.

Se tudo o que você tem interesse é o total geral, você pode acrescentar isto ao comando acima.

| tail -1
    
por 02.11.2011 / 08:06
0

Tente:

$ find . -type f -exec wc -w {} \; -print | nawk -f sum -

em que sum é o arquivo de programa nawk / gawk / awk fornecido pelas duas linhas abaixo que é executado para cada saída de linha do comando no lado esquerdo do símbolo de pipe - por exemplo, '|':

{ s += $1 }
END { print "word sum = ", s }

Nota: as permissões dos arquivos são importantes, portanto, é possível obter a saída com permissão negada, caso contrário, todos os arquivos pertencentes ao usuário que emite o comando find acima são canalizados para o comando nawk (ou gawk ou awk) estão procurando menos quaisquer arquivos para os quais o usuário não tenha permissão de leitura.

    
por 02.11.2011 / 18:26

Tags