On Mon, Nov 29, 1999 at 11:04:36PM -0500, [EMAIL PROTECTED] wrote:
> Not sure if -hackers is the place for this, but here goes.
>
> Here's a patch to add -h flag to df to produce human readable
> output. This makes it easier to read if the disk is big.
> Example:
>
> [badmofo@/home/matt] df -h
> Filesystem Size Used Avail Capacity Mounted on
> /dev/wd0s1a 722M 20M 644M 3% /
> /dev/wd0s2h 9.9G 4.4G 4.8G 48% /usr
> procfs 4.0K 4.0K 0B 100% /proc
> ....
>
> Code merged from OpenBSD and added to FreeBSD-STABLE.
[patch snipped]
For what it's worth, I'd ported this a few months back (file dated
Aug 28), but forgot about it :-). Here's the patch updated for
-current, anyway.
Index: df.1
===================================================================
RCS file: /home/ncvs/src/bin/df/df.1,v
retrieving revision 1.17
diff -u -r1.17 df.1
--- df.1 1999/11/01 04:57:42 1.17
+++ df.1 1999/11/30 05:38:47
@@ -40,7 +40,7 @@
.Nd display free disk space
.Sh SYNOPSIS
.Nm df
-.Op Fl aikn
+.Op Fl ahikmn
.Op Fl t Ar type
.Op Ar file | Ar filesystem ...
.Sh DESCRIPTION
@@ -62,6 +62,10 @@
.It Fl a
Show all mount points, including those that were mounted with the MNT_IGNORE
flag.
+.It Fl h
+"Human-readable" output. Use unit suffixes: Byte, Kilobyte, Megabyte,
+Gigabyte, Terabyte, Petabyte, Exabyte in order to reduce the number of
+digits to four or less.
.It Fl i
Include statistics on the number of free inodes.
.It Fl k
Index: df.c
===================================================================
RCS file: /home/ncvs/src/bin/df/df.c,v
retrieving revision 1.22
diff -u -r1.22 df.c
--- df.c 1999/11/01 04:57:43 1.22
+++ df.c 1999/11/30 05:38:47
@@ -59,21 +59,27 @@
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+typedef enum { NONE = 0, KILO, MEGA, GIGA, TERA, PETA /* , EXA */ } unit_t;
+
int checkvfsname __P((const char *, char **));
char **makevfslist __P((char *));
long regetmntinfo __P((struct statfs **, long, char **));
int bread __P((off_t, void *, int));
char *getmntpt __P((char *));
+void prthuman __P((struct statfs *, long));
+void prthumanval __P((double));
void prtstat __P((struct statfs *, int));
int ufs_df __P((char *, int));
+unit_t unit_adjust __P((double *));
void usage __P((void));
-int aflag = 0, iflag, nflag;
+int aflag = 0, hflag, iflag, nflag;
struct ufs_args mdev;
int
@@ -88,11 +94,14 @@
char *mntpt, *mntpath, **vfslist;
vfslist = NULL;
- while ((ch = getopt(argc, argv, "aiknt:")) != -1)
+ while ((ch = getopt(argc, argv, "ahiknt:")) != -1)
switch (ch) {
case 'a':
aflag = 1;
break;
+ case 'h':
+ hflag = 1;
+ break;
case 'i':
iflag = 1;
break;
@@ -249,6 +258,68 @@
}
/*
+ * Output in "human-readable" format. Uses 3 digits max and puts
+ * unit suffixes at the end. Makes output compact and easy to read,
+ * especially on huge disks.
+ *
+ */
+
+unit_t
+unit_adjust(val)
+ double *val;
+{
+ double abval;
+ unit_t unit;
+
+ abval = fabs(*val);
+ if (abval < 1024)
+ unit = NONE;
+ else if (abval < 1048576ULL) {
+ unit = KILO;
+ *val /= 1024;
+ } else if (abval < 1073741824ULL) {
+ unit = MEGA;
+ *val /= 1048576;
+ } else if (abval < 1099511627776ULL) {
+ unit = GIGA;
+ *val /= 1073741824ULL;
+ } else if (abval < 1125899906842624ULL) {
+ unit = TERA;
+ *val /= 1099511627776ULL;
+ } else if (abval < 1152921504606846976ULL) {
+ unit = PETA;
+ *val /= 1125899906842624ULL;
+ }
+ return (unit);
+}
+
+void
+prthuman(sfsp, used)
+ struct statfs *sfsp;
+ long used;
+{
+ prthumanval((double)(sfsp->f_blocks) * (double)(sfsp->f_bsize));
+ prthumanval((double)(used) * (double)(sfsp->f_bsize));
+ prthumanval((double)(sfsp->f_bavail) * (double)(sfsp->f_bsize));
+}
+
+void
+prthumanval(bytes)
+ double bytes;
+{
+ unit_t unit;
+
+ unit = unit_adjust(&bytes);
+
+ if (bytes == 0)
+ (void)printf(" 0B");
+ else if (bytes > 10)
+ (void)printf(" %5.0f%c", bytes, "BKMGTPE"[unit]);
+ else
+ (void)printf(" %5.1f%c", bytes, "BKMGTPE"[unit]);
+}
+
+/*
* Convert statfs returned filesystem size into BLOCKSIZE units.
* Attempts to avoid overflow for large filesystems.
*/
@@ -272,9 +343,16 @@
if (maxwidth < 11)
maxwidth = 11;
if (++timesthrough == 1) {
- header = getbsize(&headerlen, &blocksize);
- (void)printf("%-*.*s %s Used Avail Capacity",
- maxwidth, maxwidth, "Filesystem", header);
+ if (hflag) {
+ header = " Size";
+ headerlen = strlen(header);
+ (void)printf("%-*.*s %s Used Avail Capacity",
+ maxwidth, maxwidth, "Filesystem", header);
+ } else {
+ header = getbsize(&headerlen, &blocksize);
+ (void)printf("%-*.*s %s Used Avail Capacity",
+ maxwidth, maxwidth, "Filesystem", header);
+ }
if (iflag)
(void)printf(" iused ifree %%iused");
(void)printf(" Mounted on\n");
@@ -282,10 +360,13 @@
(void)printf("%-*.*s", maxwidth, maxwidth, sfsp->f_mntfromname);
used = sfsp->f_blocks - sfsp->f_bfree;
availblks = sfsp->f_bavail + used;
- (void)printf(" %*ld %8ld %8ld", headerlen,
- fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
- fsbtoblk(used, sfsp->f_bsize, blocksize),
- fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
+ if (hflag)
+ prthuman(sfsp, used);
+ else
+ (void)printf(" %*ld %8ld %8ld", headerlen,
+ fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
+ fsbtoblk(used, sfsp->f_bsize, blocksize),
+ fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
(void)printf(" %5.0f%%",
availblks == 0 ? 100.0 : (double)used / (double)availblks * 100.0);
if (iflag) {
-Chris
--
[EMAIL PROTECTED] [EMAIL PROTECTED]
Abbotsford, BC, Canada
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message