quinta-feira, 24 de novembro de 2022

Como Calcular o Tamanho de um Diretório no Linux

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