sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 4608d91c6d21fafe95bd167d754044c09aadb071
parent 44319a397244309a7516922473aa83ce0f4a10e4
Author: sin <sin@2f30.org>
Date:   Thu, 16 Oct 2014 10:06:27 +0100

Add human readable output to du(1)

Thanks Jeffrey Picard!

Diffstat:
MLICENSE | 1+
Mdu.1 | 4++++
Mdu.c | 27++++++++++++++++++++++++++-
3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/LICENSE b/LICENSE @@ -27,6 +27,7 @@ MIT/X Consortium License © 2014 Laslo Hunhold <dev@frign.de> © 2014 Daniel Bainton <dpb@driftaway.org> © 2014 Tuukka Kataja <stuge@xor.fi> +© 2014 Jeffrey Picard <jeff@jeffreypicard.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/du.1 b/du.1 @@ -8,6 +8,7 @@ du \- display disk usage statistics .B \-s .RB ] .RB [ \-k ] +.RB [ \-h ] .RI [ file ...] .SH DESCRIPTION .B du @@ -27,3 +28,6 @@ Display only the grand total for the specified files. .BI \-k By default all sizes are reported in 512-byte block counts. The -k option causes the numbers to be reported in kilobyte counts. +.TP +.BI \-h +Enable human readable output. diff --git a/du.c b/du.c @@ -16,6 +16,7 @@ static char file[PATH_MAX]; static bool aflag = false; static bool sflag = false; static bool kflag = false; +static bool hflag = false; static long du(const char *); static void print(long n, char *path); @@ -53,6 +54,9 @@ main(int argc, char *argv[]) case 'k': kflag = true; break; + case 'h': + hflag = true; + break; default: usage(); } ARGEND; @@ -82,9 +86,30 @@ main(int argc, char *argv[]) } static void +print_human(long n, char *path) +{ + long base = 1024; + long power = base; + char postfixes[] = {'B', 'K', 'M', 'G', 'T', 'P', 'E'}; + int i = 0; + + n = n * blksize; + while (n > power) { + power = power*base; + i++; + } + + n = i ? n / (power / base) : n; + printf("%lu%c\t%s\n", n, postfixes[i], path); +} + +static void print(long n, char *path) { - printf("%lu\t%s\n", n, path); + if (hflag) + print_human(n, path); + else + printf("%lu\t%s\n", n, path); } static char *