Contar espaços em branco no diretório BASH
Eu só quero contar espaço em branco no diretório, mas não encontro como fazer com o comando AWK. Atualmente eu tenho esse código
res=0
IFS="
"
cd DirPath
res2=0
res3=0
ws=0
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
let " ws += `wc -c $f | awk -v RS='[[:space:]]' 'END{print NR}'` "
done
mas o resultado é muito baixo (176) considerando que tenho 1300000 char neste diretório
Respostas
Para contar o número de caracteres de nova linha ( -l), palavras ( -w, que wcsão sequências de caracteres que não são espaços em branco , portanto, as palavras são delimitadas por espaços em branco ou não caracteres), caracteres ( -m) e bytes ( -c), você pode fazer:
find . -type f -exec cat {} + | wc -lwmc
No entanto, observe que, porque catconcatena os arquivos, pode fornecer resultados incorretos para a contagem de palavras e caracteres se houver arquivos que não terminem em um caractere de espaço em branco (os arquivos de texto devem terminar em um caractere de nova linha, que é um caractere de espaço em branco), pois pode acabar juntando dois bytes em um caractere válido, por exemplo, ou juntando duas palavras.
Exemplo:
$ od -tx1 a
0000000 c3
0000001
$ od -tx1 b
0000000 a9
0000001
$ wc -m a b
0 a
0 b
0 total
$ cat a b | wc -m
1
$ printf foo > a
$ printf bar > b
$ wc -w a b
1 a
1 b
2 total
$ cat a b | wc -w
1
Para contar os caracteres de espaço em branco, POSIXly, você poderia fazer:
find . -type f -exec cat {} + | tr -cd '[:space:]' | wc -m
(com a mesma ressalva sobre juntar bytes em caracteres), mas observe que com GNU tr, isso funciona apenas para caracteres de byte único (portanto, não caracteres não ASCII codificados em UTF-8, por exemplo).
Em sistemas GNU, você pode recorrer ao GNU grepe usar:
grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c
Embora observe que, porque com -z, grepfunciona em registros delimitados por NUL, isso acabaria consumindo arquivos de texto inteiros na memória (já que os arquivos de texto normalmente não contêm bytes NUL).
cd DIRPATH
res2=0
res3=0
ws=0
let " ws += `grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c` "
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
done
O código anterior fornece o número de espaços em branco no diretório em ws var
Tente com GNU grep:
grep -ro '[[:space:]]' | wc -l