Esta pergunta respondida explica como pesquisar e classificar um nome de arquivo específico, mas como você faria isso para um diretório inteiro? Tenho 1 milhão de arquivos de texto que preciso para pesquisar as dez palavras mais usadas.
database= /data/000/0000000/s##_date/*.txt - /data/999/0999999/s##_data/*txt
Tudo o que tentei resulta na classificação de nomes de arquivos, caminhos ou erros de diretório.
Fiz algum progresso com grep, mas partes de nomes de arquivos parecem aparecer em meus resultados.
grep -r . * | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head -10
output:
1145
253 txt
190 s01
132 is
126 of
116 the
108 and
104 test
92 with
84 in
O 'txt' e 's01' vêm de nomes de arquivo e não do texto dentro do arquivo de texto. Eu sei que existem maneiras de excluir palavras comuns como "o", mas prefiro não classificar e contar os nomes dos arquivos.
grep
mostrará o nome de arquivo de cada arquivo que corresponde ao padrão junto com a linha que contém a correspondência se mais de um arquivo for pesquisado, que é o que está acontecendo no seu caso.Em vez de usar
grep
(que é uma solução inspirada, mas lenta, para não conseguircat
todos os arquivos na linha de comando de uma só vez), você pode realmentecat
todos os arquivos de texto juntos e processá-los como um grande documento como este:Eu adicionei
-s
paratr
que várias novas linhas consecutivas sejam compactadas em uma e altero todos os não alfanuméricos para novas linhas ([\n*]
fazia pouco sentido para mim). Ohead
comando produz dez linhas de saída por padrão, então-10
(ou-n 10
) não é necessário.O
find
comando localiza todos os arquivos regulares (-type f
) em qualquer lugar/data
cujos nomes de arquivo correspondam ao padrão*.txt
. Para o maior número possível desses arquivos por vez,cat
é invocado para concatená-los (é isso que-exec cat {} +
faz).cat
é possivelmente invocado muitas vezes se você tiver um grande número de arquivos, mas isso não afeta o restante do pipeline, pois apenas lê o fluxo de saída defind
+cat
.Para evitar a contagem de linhas vazias, você pode inserir
sed '/^ *$/d'
um pouco antes ou logo após o primeirosort
no pipeline.