4

Я работаю над небольшим утилитарным инструментом, написанным на bash, который дает мне некоторую информацию об игровом сервере в Linux. По этой причине мне нужна возможность отображать размер содержимого файла.

Я делаю это прямо сейчас, используя это:

du -Lshc *

Работает практически идеально! Единственный недостаток в том, что он отображает такие вещи:

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

Это хорошо, но я хочу больше цифр. То есть это должно выглядеть так:

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

Есть ли возможность сделать это?

Я не возражаю против использования сложной команды, поскольку я использую ее в файле .sh поэтому я не буду вводить ее каждый раз вручную.

2 ответа2

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
    }
'

awk-функция, основанная на этом.

Можно, вероятно, сделать вывод более приятным, пропустив его через column или оставив слева пробелы.

Редактировать: добавлен левый отступ.

Также для сортировки списка: du -Lsbc * | sort -n | awk и затем awk-скрипт.

-1

Вот моя реализация bash с использованием кода @ 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);
}

Пытаться

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

Выход

1.000 kiB
4.000 kiB
500.000 kiB
7.810 MiB
500.000 MiB
500.000 GiB
1.980 GiB

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .