O problema é que o MAWK (a variante AWK instalada no Ubuntu) por padrão imprime números inteiros maiores que 2147483647
(2 31 -1) em notação científica:
% awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040
% printf '2147483647\n' | awk '{x += ; print x}'
2147483647
% printf '2147483648\n' | awk '{x += ; print x}'
2.14748e+09
Você pode usar printf
com um especificador de formato em vez de print
*:
printf '2147483648\n' | awk '{x += ; printf "%.0f\n", x}'
% printf '2147483648\n' | awk '{x += ; printf "%.0f\n", x}'
2147483648
No seu caso:
ls -lR | grep -v '^d' | awk '{total += } END {printf "Total:%.0f\n", total}'
ls -lR |
grep -v '^d' |
awk '
{
total +=
}
END {
printf "Total:%.0f\n", total
}
'
Isso forçará o AWK a imprimir total
em notação decimal em vez de em notação científica.
No entanto, em outra nota, você nunca deve analisar ls
.
Uma maneira mais sensata de fazer isso seria usar find
+ stat
:
find . -type f -exec stat -c '%s' {} + | awk '{total += } END {printf "Total:%.0f\n", total}'
find . -type f -exec stat -c '%s' {} + |
awk '
{
total +=
}
END {
printf "Total:%.0f\n", total
}
'
* %.0f
é um truque para tornar printf
números de impressão maiores que 2147483647
(2 31 -1), que usando %d
como o especificador de formato sempre seria impresso como %código%. O limite de 2147483647
é que um começará a perder precisão após %.0f
(2 53 ), se isso for uma preocupação (graças ao Rotsor para obter informações úteis).