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:
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 *