Human readable and by size sorted disk usage (du) in BASH

This is a quick tip to fix a problem that has always bugged me.
When showing disk usage in a human readable form (KB, MB, GB) for each subdirectory using du -sh *, how can you properly sort it by size.

If you just want the solution here it is as “one-liner”:

function duf {
    du -sk "$@" | sort -n | while read size fname; do for unit in k M G T P E Z Y; do if [ $size -lt 1024 ]; then echo -e "${size}${unit}\t${fname}"; break; fi; size=$((size/1024)); done; done

Just put this function into your ~/.bashrc to make it permanent.

[ad name=”Adsense – text only”]

The expanded code:

function duf {

    // get usage in KBytes and sort
    du -sk "$@" | sort -n | while read size fname;
    // loops for each size
    do for unit in k M G T P E Z Y;
        // if size<1024 we found the correct suffix
        if [ $size -lt 1024 ];
        // display the size
        then echo -e "${size}${unit}\t${fname}";
    // line completed
    // for each sizes suffix divide by 1024

When done, you can use your new function like this: duf /*.


Leave a comment

Your email address will not be published.