O GNU sort tem um sinalizador de -h / --human-numeric-sort e h sort para manipular esses (ele espera unidades baseadas em 1024 (1.023 classificadas antes de 1K), que são como o% GNUdu conta também.
Agora observe que alguma precisão é perdida quando você usa du -h , então o pedido pode acabar errado:
$ du -k a b
1212 a
1208 b
$ du -h a b | sort -h
1.2M a
1.2M b
Como mencionado por @StephenKitt, você pode contorná-lo dizendo du para obter a precisão total e somente converter para o formato humano após a classificação usando por exemplo GNU numfmt :
$ du --block-size=1 a b | sort -n | numfmt --to=iec
1.2M b
1.2M a
(cuidado com o espaçamento afetado). Todos os itens acima assumem que os nomes dos arquivos não contêm caracteres de nova linha.
Quanto à questão genérica sobre ordenação por tamanho, zsh globs tem um qualificador oL glob para isso (note que é pelo tamanho, não pelo uso do disco).
ls -S pode ser feito (com GNU ls para seu -U para não classificado):
ls -ldU -- *(oL)
Para classificar por tamanho após a resolução de links simbólicos:
ls -LldU -- *(-oL)
wc -c -- *(-oL)