“du -h” com mais casas decimais

4

Estou trabalhando em uma pequena ferramenta util escrita no bash que me fornece algumas informações sobre um servidor de jogo no Linux. Por essa razão, eu preciso da possibilidade de exibir o tamanho do conteúdo do arquivo.

Estou fazendo isso agora usando isso:

du -Lshc *

Funciona quase perfeito! A única falha é que ele exibe coisas assim:

21G     backups
22G     server
8.0K    start.sh
151M    world.zip
43G     total

Isso está bem, mas eu quero mais dígitos. Significa que deve ser assim:

21.587G     backups
22.124G     server
8.089K      start.sh
151.198M    world.zip
43.436G     total

Existe possibilidade de fazer isso?

Eu não me importaria de usar um comando complexo, já que eu o uso em um arquivo .sh , então não vou digitá-lo manualmente toda vez.

    
por BrainStone 17.08.2013 / 22:42

2 respostas

5
du -Lsbc * | awk '
    function hr(bytes) {
        hum[1024**4]="TiB";
        hum[1024**3]="GiB";
        hum[1024**2]="MiB";
        hum[1024]="kiB";
        for (x = 1024**4; x >= 1024; x /= 1024) {
            if (bytes >= x) {
                return sprintf("%8.3f %s", bytes/x, hum[x]);
            }
        }
        return sprintf("%4d     B", bytes);
    }

    {
        print hr($1) "\t" $2
    }
'

função-awk baseada em isso .

Poder-se-ia provavelmente tornar a saída um pouco mais interessante, passando-a por column ou preenchendo-a à esquerda com espaços.

Editar: foi adicionado o preenchimento à esquerda.

Além disso, para classificar a lista: du -Lsbc * | sort -n | awk e depois o awk-script.

    
por 18.08.2013 / 03:56
-1

Aqui está minha implementação bash usando o código de @ n.st

hr() {
    bytes=$1
    hum[1024**4]="TiB";
    hum[1024**3]="GiB";
    hum[1024**2]="MiB";
    hum[1024]="kiB";
    x=0
    for ((x = 1024**4; $x >= 1024; x = ($x/1024) ))
    do
        if [ "$bytes" -ge "$x" ]; then
            $(printf "%8.3f %s" $( echo "$bytes $x" | awk '{printf "%.2f \n", $1/$2}' ) ${hum[$x]});
            return 0;
        fi
    done
    echo $(printf "%4d     B" $bytes);
}

Tente

echo $(hr 1024);
echo $(hr 4096);
echo $(hr $((1024*500)) );
echo $(hr $((1024*8000)) );
echo $(hr $((1024*1024*500)) );
echo $(hr $((1024*1024*1024*500)) );
echo $(hr 2127780017);

Saída

1.000 kiB
4.000 kiB
500.000 kiB
7.810 MiB
500.000 MiB
500.000 GiB
1.980 GiB
    
por 08.08.2018 / 16:56