Показать статистику
0 голосов
от (2.4тыс. баллов)

Мне нужно получить человечески-читаемый список файлов с их размерами. Утилита du не может сортировать "по размеру". А если использовать sort, то вывод тоже неудобно читать.

Вот, к примеру, если запустить:

du | sort -n -r 

Вот так можно вывести сортированный список по размеру (от большего к меньшему)

du |sort -n -r
65408   .
61208   ./mydir3
2056    ./mydir4
1002    ./mydir1
308     ./mydir2

Однако если выводить цифры в нормально "человеческом" виде через ключ -h, то никакой сортировки не получается:

du -h | sort -n -r

308K    ./dir2
66M     .
61M     ./dir3
1.1M    ./dir4
2.1M    ./dir1

Кто нибудь знает как отсортировать du -h по размеру?

5.2тыс. просмотров 1 ответов

1 Ответ

0 голосов
от (17.4тыс. баллов)

Есть несколько вариантов. 

Вот конструкция на потоковом редакторе sed, которая прилепит "килобайты" к вашим циферкам:

du -k | sed -e 's_^\([0-9]*\)_\1 KB_' | sort -n

Посольку вы не указали на какой системы вы пытаетесь построить такой сортированный список, то укажу так же конструкцию для MacOS (потому что там утилита sort не имеет ключа -h):

du -sk * | sort -g | awk '{ numBytes = $1 * 1024; numUnits = split("B K M G T P", unit); num = numBytes; iUnit = 0; while(num >= 1024 && iUnit + 1 < numUnits) { num = num / 1024; iUnit++; } $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]); print $0; }'

А вообще, если у вас Linux с более-менее свежими пакетами, то конструкция может быть гораздо более простой:

du -hs * | sort -h

...