Começamos com o mais óbvio:
du -h
Mas não quero ver todo o caminho até o último diretório, então só mostro os primeiros:
du -h --max-depth=1
Mas o diretório é um share de uma máquina Windows e o du não retorna os tamanhos corretos das coisas:
find . -type f -exec stat -c "%s" {} \; \
| awk '{ sum += $1 } END { print sum }'
E se quero apenas somar os arquivos de um determinado tipo (ou excluir alguns), posso tentar:
find . -name "*.pdf" -exec stat -c "%s" {} \; \
| awk '{ sum += $1 } END { print sum }'
O find permite imprimir metadados sobre os arquivos com a opção -printf. Uma solução alternativa e mais simples, seria:
find . -type f -printf "%s\n" | paste -sd+ | bc
O comando paste junta todas as linhas com o delimitador + e o bc (An arbitrary precision calculator language) trata o resultado como uma grande conta.
A solução paste/bc, além de mais simples, tem um desempenho muito melhor:
$time find . -type f -printf "%s\n" | paste -sd+ | bc
2077156224168
real 7m26.561s
user 0m7.055s
sys 0m45.229s
$time find . -type f -exec stat -c "%s" {} \; \
| awk '{ sum += $1 } END { print sum }'
2077297872908
real 58m51.533s
user 12m15.312s
sys 36m52.712s
O time que reside em /usr/bin/time permite também verificar o uso de memória:
$/usr/bin/time -v find . -type f -printf "%s\n" | paste -sd+ | bc
Command being timed: "find . -type f -printf %s\n"
User time (seconds): 0.03
System time (seconds): 0.24
Percent of CPU this job got: 14%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.03
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1196
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 363
Voluntary context switches: 4115
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
517010213
$/usr/bin/time -v find . -type f -exec stat -c "%s" {} \; \
| awk '{ sum += $1 } END { print sum }'
Command being timed: "find . -type f -exec stat -c %s {} ;"
User time (seconds): 1.13
System time (seconds): 3.50
Percent of CPU this job got: 69%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.67
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1200
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 491652
Voluntary context switches: 7300
Involuntary context switches: 1558
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
517010213
Este último teste mostrou que os usos de memória das duas soluções são parecidos.

Nenhum comentário:
Postar um comentário