bug-fileutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

du suggestion


From: Tim Newsham
Subject: du suggestion
Date: Sat, 19 Jun 2004 13:27:25 -1000 (HST)

Would be nice if DU could print out the cost of the storage rather
than the number of blocks.  The following code shows an example
of this (option -$ reads a cost from /usr/share/du-cost and applies
it before printout out the result).

Tim N.


--- du.c.orig   Fri Jun 18 15:51:04 2004
+++ du.c        Fri Jun 18 16:09:07 2004
@@ -29,6 +29,7 @@
    -H          Similar, but use powers of 1000 not 1024.
    -k          Print sizes in kilobytes.
    -m          Print sizes in megabytes.
+   -$          Print sizes in dollars.
    -b          Print sizes in bytes.
    -S          Count the size of each directory separately, not including
                the sizes of subdirectories.
@@ -137,9 +138,13 @@
 static int max_depth = INT_MAX;

 /* If positive, the units to use when printing sizes;
-   if negative, the human-readable base.  */
+   if negative, the human-readable base.
+   if zero, the storage cost */
 static int output_block_size;

+#define COSTNAME SHAREDIR "/du-cost"
+static float byte_cost = 0.0;
+
 /* Accumulated path for file or directory being processed.  */
 static String *path;

@@ -219,6 +224,7 @@
   -s, --summarize       display only a total for each argument\n\
   -x, --one-file-system  skip directories on different filesystems\n\
   -X FILE, --exclude-from=FILE  Exclude files that match any pattern in 
FILE.\n\
+  -$                    show sizes in dollars.
       --exclude=PAT     Exclude files that match PAT.\n\
       --max-depth=N     print the total for a directory (or file, with 
--all)\n\
                           only if it is N or fewer levels below the command\n\
@@ -300,10 +306,17 @@
 print_size (uintmax_t n_blocks, const char *string)
 {
   char buf[LONGEST_HUMAN_READABLE + 1];
-  printf ("%s\t%s\n",
+  if(output_block_size == 0) {
+    /* this would be better as a fix to human_readable_inexact, but
+     * this is easier for a quick prototype (single file)
+     */
+    printf ("$%.2f\t%s\n", n_blocks * (ST_NBLOCKSIZE * byte_cost), string);
+  } else {
+    printf ("%s\t%s\n",
          human_readable_inexact (n_blocks, buf, ST_NBLOCKSIZE,
                                  output_block_size, human_ceiling),
          string);
+  }
   fflush (stdout);
 }

@@ -668,7 +681,7 @@

   human_block_size (getenv ("DU_BLOCK_SIZE"), 0, &output_block_size);

-  while ((c = getopt_long (argc, argv, "abchHklmsxDLSX:", long_options, NULL))
+  while ((c = getopt_long (argc, argv, "abchHklmsxDLSX:$", long_options, NULL))
         != -1)
     {
       long int tmp_long;
@@ -743,6 +756,10 @@
            error (1, errno, "%s", quote (optarg));
          break;

+       case '$':
+         output_block_size = 0;
+         break;
+
        case EXCLUDE_OPTION:
          add_exclude (exclude, optarg);
          break;
@@ -758,6 +775,26 @@
        default:
          usage (1);
        }
+    }
+
+  /*
+   * ick!  look at these indents!  placement of braces and
+   * spaces around parenthesis!  Who wrote this, the french!?
+   * oh well, I will try to abide by their horrible style rules.
+   */
+  if (output_block_size == 0)
+    {
+      FILE *fp = fopen (COSTNAME, "r");
+      if (!fp)
+        {
+          error (0, errno, COSTNAME);
+          usage (1);
+        }
+      if (fscanf (fp, "%f", &byte_cost) != 1)
+        {
+          error (0, 0, "Error reading cost file");
+        }
+      fclose (fp);
     }

   if (opt_all && opt_summarize_only)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]