[prev in list] [next in list] [prev in thread] [next in thread] 

List:       coreutils-bug
Subject:    [PATCH] Support in du for showing both apparent and on-disk size
From:       Luca Barbieri <luca.barbieri () gmail ! com>
Date:       2007-01-31 20:56:10
Message-ID: 1170276970.3820.4.camel () lb-linux
[Download RAW message or body]

This patch allows to display simultaneously both the disk usage and
apparent size and also allows to display the "completeness" (or
"nonsparsity") of file, which is the ratio of the disk usage to the
apparent size.

For instance, this is useful when dealing with software that download
files by creating sparse files and filling them: the "completeness" then
is approximately the progress of the download.

--- du-ratio.orig/src/du.c	2005-11-04 11:58:30.000000000 +0100
+++ du-ratio/src/du.c	2007-01-30 01:39:50.000000000 +0100
@@ -84,6 +84,9 @@
   /* Size of files in directory.  */
   uintmax_t size;
 
+  /* Apparent size of files in directory.  */
+  uintmax_t apparent_size;
+
   /* Latest time stamp found.  If tmax.tv_sec == TYPE_MINIMUM (time_t)
      && tmax.tv_nsec < 0, no time stamp has been found.  */
   struct timespec tmax;
@@ -94,15 +97,17 @@
 duinfo_init (struct duinfo *a)
 {
   a->size = 0;
+  a->apparent_size = 0;
   a->tmax.tv_sec = TYPE_MINIMUM (time_t);
   a->tmax.tv_nsec = -1;
 }
 
 /* Set directory data.  */
 static inline void
-duinfo_set (struct duinfo *a, uintmax_t size, struct timespec tmax)
+duinfo_set (struct duinfo *a, uintmax_t size, uintmax_t apparent_size, struct timespec tmax)
 {
   a->size = size;
+  a->apparent_size = apparent_size;
   a->tmax = tmax;
 }
 
@@ -111,6 +116,7 @@
 duinfo_add (struct duinfo *a, struct duinfo const *b)
 {
   a->size += b->size;
+  a->apparent_size += b->apparent_size;
   if (timespec_cmp (a->tmax, b->tmax) < 0)
     a->tmax = b->tmax;
 }
@@ -135,6 +141,12 @@
    use the apparent size (a la stat.st_size).  */
 static bool apparent_size = false;
 
+/* Print size / apparent size ratio.  */
+static bool print_completeness = false;
+
+/* Print the disk usage.  */
+static bool print_disk_usage = false;
+
 /* If true, count each hard link of files with multiple links.  */
 static bool opt_count_all = false;
 
@@ -206,7 +218,9 @@
   MEGABYTES_LONG_OPTION,
 
   TIME_OPTION,
-  TIME_STYLE_OPTION
+  TIME_STYLE_OPTION,
+  SIZE_OPTION,
+  COMPLETENESS_OPTION,
 };
 
 static struct option const long_options[] =
@@ -215,6 +229,7 @@
   {"apparent-size", no_argument, NULL, APPARENT_SIZE_OPTION},
   {"block-size", required_argument, NULL, 'B'},
   {"bytes", no_argument, NULL, 'b'},
+  {"completeness", no_argument, NULL, COMPLETENESS_OPTION},
   {"count-links", no_argument, NULL, 'l'},
   {"dereference", no_argument, NULL, 'L'},
   {"dereference-args", no_argument, NULL, 'D'},
@@ -230,6 +245,7 @@
   {"no-dereference", no_argument, NULL, 'P'},
   {"one-file-system", no_argument, NULL, 'x'},
   {"separate-dirs", no_argument, NULL, 'S'},
+  {"size", no_argument, NULL, SIZE_OPTION},
   {"summarize", no_argument, NULL, 's'},
   {"total", no_argument, NULL, 'c'},
   {"time", optional_argument, NULL, TIME_OPTION},
@@ -297,6 +313,7 @@
   -B, --block-size=SIZE use SIZE-byte blocks\n\
   -b, --bytes           equivalent to `--apparent-size --block-size=1'\n\
   -c, --total           produce a grand total\n\
+      --completeness    print ratios between disk usage and apparent size\n\
   -D, --dereference-args  dereference FILEs that are symbolic links\n\
 "), stdout);
       fputs (_("\
@@ -315,6 +332,7 @@
   -P, --no-dereference  don't follow any symbolic links (this is the default)\n\
   -0, --null            end each output line with 0 byte rather than newline\n\
   -S, --separate-dirs   do not include size of subdirectories\n\
+      --size            print disk usage\n\
   -s, --summarize       display only a total for each argument\n\
 "), stdout);
       fputs (_("\
@@ -445,7 +463,29 @@
 static void
 print_size (const struct duinfo *pdui, const char *string)
 {
-  print_only_size (pdui->size);
+  bool printed = false;
+
+  if(print_disk_usage)
+  {
+    if(printed) fputc('\t', stdout);
+    printed = true;
+    print_only_size (pdui->size);
+  }
+  
+  if(apparent_size)
+  {
+    if(printed) fputc('\t', stdout);
+    printed = true;
+    print_only_size (pdui->apparent_size);
+  }
+    
+  if(print_completeness)
+  {
+    if(printed) fputc('\t', stdout);
+    printed = true;
+    fprintf(stdout, "%f", (double)pdui->size / (double)pdui->apparent_size);
+  }
+    
   if (opt_time)
     {
       putchar ('\t');
@@ -535,9 +575,8 @@
   else
     {
       duinfo_set (&dui,
-		  (apparent_size
-		   ? sb->st_size
-		   : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE),
+		   (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE,
+		   sb->st_size,
 		  (time_type == time_mtime ? get_stat_mtime (sb)
 		   : time_type == time_atime ? get_stat_atime (sb)
 		   : get_stat_ctime (sb)));
@@ -725,6 +764,14 @@
 	  apparent_size = true;
 	  break;
 
+	case SIZE_OPTION:
+	  print_disk_usage = true;
+	  break;
+
+	case COMPLETENESS_OPTION:
+	  print_completeness = true;
+	  break;
+
 	case 'b':
 	  apparent_size = true;
 	  human_output_opts = 0;
@@ -859,6 +906,9 @@
   if (!ok)
     usage (EXIT_FAILURE);
 
+  if(!apparent_size && !print_completeness)
+    print_disk_usage = true;
+
   if (opt_all & opt_summarize_only)
     {
       error (0, 0, _("cannot both summarize and show all entries"));





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic