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. 

[badmofo@/usr/src/bin/df] diff -u df df~
diff -u df/df.1 df~/df.1
--- df/df.1     Sun Aug 29 10:12:14 1999
+++ df~/df.1    Mon Nov 29 22:57:01 1999
@@ -40,7 +40,7 @@
 .Nd display free disk space
 .Sh SYNOPSIS
 .Nm df
-.Op Fl ikn
+.Op Fl hikn
 .Op Fl t Ar type
 .Op Ar file | Ar filesystem ...
 .Sh DESCRIPTION
@@ -59,6 +59,10 @@
 .Pp
 The following options are available:
 .Bl -tag -width Ds
+.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
diff -u df/df.c df~/df.c
--- df/df.c     Sun Aug 29 10:12:15 1999
+++ df~/df.c    Mon Nov 29 22:57:01 1999
@@ -59,11 +59,14 @@
 #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 **));
@@ -71,9 +74,12 @@
 char    *getmntpt __P((char *));
 void     prtstat __P((struct statfs *, int));
 int      ufs_df __P((char *, int));
+unit_t unit_adjust __P((double *));
+void   prthumanval __P((double));
+void   prthuman __P((struct statfs *, long));
 void     usage __P((void));
 
-int    iflag, nflag;
+int    iflag, nflag, hflag;
 struct ufs_args mdev;
 
 int
@@ -88,8 +94,11 @@
        char *mntpt, *mntpath, **vfslist;
 
        vfslist = NULL;
-       while ((ch = getopt(argc, argv, "iknt:")) != -1)
+       while ((ch = getopt(argc, argv, "hiknt:")) != -1)
                switch (ch) {
+               case 'h':
+                       hflag = 1;
+                       break;
                case 'i':
                        iflag = 1;
                        break;
@@ -267,20 +276,26 @@
        if (maxwidth < 11)
                maxwidth = 11;
        if (++timesthrough == 1) {
-               header = getbsize(&headerlen, &blocksize);
-               (void)printf("%-*.*s %s     Used    Avail Capacity",
+               if(hflag)
+                       header = "  Size";
+               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");
+               (void)printf(" Mounted on\n");
        }
        (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) {
@@ -290,7 +305,67 @@
                   inodes == 0 ? 100.0 : (double)used / (double)inodes * 100.0);
        } else
                (void)printf("  ");
-       (void)printf("  %s\n", sfsp->f_mntonname);
+       (void)printf("   %s\n", sfsp->f_mntonname);
+}
+
+/*
+ * "human-readable" output: use 3 digits max.--put unit suffixes at
+ * the end.  Makes output compact and easy-to-read esp. 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
+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]);
+}
+
+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));
 }
 
 /*
@@ -377,6 +452,6 @@
 usage()
 {
        (void)fprintf(stderr,
-           "usage: df [-ikn] [-t type] [file | filesystem ...]\n");
+           "usage: df [-hikn] [-t type] [file | filesystem ...]\n");
        exit(1);
 }
Only in df~: extern.h
Only in df~: vfslist.c

-- 
http://www.csis.gvsu.edu/matt
03 F8 23 C5 43 A2 F7 5A  24 49 F7 B0 3A F9 B1 7F
Try to understand everything, but believe nothing


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to