Contar espaços em branco no diretório BASH

Aug 24 2020

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

1 StéphaneChazelas Aug 24 2020 at 16:48

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).

ApoSkunz Aug 24 2020 at 16:31
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

pLumo Aug 24 2020 at 16:17

Tente com GNU grep:

grep -ro '[[:space:]]' | wc -l