Вам необходимо нормализовать размер перед сортировкой. Самый простой способ сделать это - использовать язык программирования, такой как Perl или Python, но вы уже заявили, что это не вариант (хотя я нахожу странным, что Perl еще нет на компьютере). Вы можете использовать шелл-код для нормализации этих данных, но это неприятно:
#!/bin/bash
ECHO=/bin/echo
TR=/usr/bin/tr
BC=/usr/bin/bc
while read dir size; do
bytes=`$ECHO $size | $TR -d "[A-Z]"`
case $size in
*B) bytes=$bytes ;;
*K) bytes=`$ECHO "$bytes * 1024" | $BC` ;;
*M) bytes=`$ECHO "$bytes * 1024 * 1024" | $BC` ;;
*G) bytes=`$ECHO "$bytes * 1024 * 1024 * 1024" | $BC` ;;
*) $ECHO unknown size type ;;
esac
echo $bytes $dir $size
done < $1
Этот сценарий оболочки принимает имя файла в качестве аргумента и выводит нормализованный размер, имя каталога и размер. Это облегчает сортировку. Чтобы вернуть исходные поля, вы можете просто обрезать первое поле:
./mk_sortable.sh file_to_sort | sort -nr | cut -f2- -d" "
Для тех, кто обращает внимание, да, я только что написал преобразование Шварца в оболочке.