Hi.

I frequently move large files from one disk to another and I wanted to see how
much was copied already.
Some friends of mine also wanted this feature and urged me to send the patch
here.

Brief description:

# cp -D large_file /another/disk

`large_file':   1% copied\r`large_file':   2% copied\r
and so on until
`large_file':  99% copied\r`large_file': 100% copied\n

This -D argument works with cp and mv using the attached patch.

Regards,
        Benjamin

-- 
Benjamin 'blindCoder' Schieder
Registered Linux User #289529: http://counter.li.org
[EMAIL PROTECTED]
-- 
GPG-Fingerprint:
9276 BD13 9D16 CCB6 8E5C  8F07 F1F5 D4F0 89BB 516C
Get my key from pgp.mit.edu
KeyID: F1F5D4F089BB516C
-- 
"Help! I'm a bug!" -<poof>- "You're a feature"
diff -Nur file_orig/src/copy.c file_new/src/copy.c
--- file_orig/src/copy.c        2001-01-13 16:49:43.000000000 +0100
+++ file_new/src/copy.c 2002-09-18 20:37:14.000000000 +0200
@@ -193,6 +193,8 @@
   off_t n_read_total = 0;
   int last_write_made_hole = 0;
   int make_holes = (x->sparse_mode == SPARSE_ALWAYS);
+  int t_read = 0;
+  int p_stat = 0;
 
   source_desc = open (src_path, O_RDONLY);
   if (source_desc < 0)
@@ -336,12 +338,40 @@
        }
       if (ip == 0)
        {
-         if (full_write (dest_desc, buf, n_read) < 0)
+         int n_written = 0;
+         n_written = full_write (dest_desc, buf, n_read);
+         if (n_written < 0)
            {
              error (0, errno, _("writing %s"), quote (dst_path));
              return_val = -1;
              goto close_src_and_dst_desc;
            }
+         else if (x->dotted_copy_style)
+           { /* TODO: insert dotted copy style */
+             int f_size = (int)sb.st_size;
+             t_read += n_written;
+             if ( (int)(((float)t_read / (float)f_size) * 100) > p_stat)
+               {
+                 p_stat = (int)(((float)t_read / (float)f_size) * 100);
+                 if (p_stat < 100)
+                   {
+                     if (p_stat < 10)
+                       {
+                         printf("
%s -> %s:   %i%% copied", quote (src_path), quote 
+(dst_path), p_stat);
+                       }
+                    else
+                       {
+                         printf("
%s -> %s:  %i%% copied", quote (src_path), quote 
+(dst_path), p_stat);
+                       }
+                   }
+                 else
+                   {
+                     printf("
%s -> %s: %i%% copied\n", quote (src_path), quote 
+(dst_path), p_stat);
+                   }
+                 fflush(stdout);
+               }
+           }
+       
          last_write_made_hole = 0;
        }
     }
diff -Nur file_orig/src/copy.h file_new/src/copy.h
--- file_orig/src/copy.h        2001-01-14 12:03:30.000000000 +0100
+++ file_new/src/copy.h 2002-09-18 19:42:55.000000000 +0200
@@ -38,6 +38,8 @@
 struct cp_options
 {
   enum backup_type backup_type;
+  int dotted_copy_style;
+  /* If 1, shows x% copied */
 
   /* If nonzero, copy all files except (directories and, if not dereferencing
      them, symbolic links,) as if they were regular files. */
diff -Nur file_orig/src/cp.c file_new/src/cp.c
--- file_orig/src/cp.c  2001-02-03 17:48:34.000000000 +0100
+++ file_new/src/cp.c   2002-09-18 19:40:24.000000000 +0200
@@ -673,6 +673,7 @@
   x->myeuid = geteuid ();
   x->move_mode = 0;
   x->one_file_system = 0;
+  x->dotted_copy_style = 0;
 
   x->preserve_owner_and_group = 0;
   x->preserve_chmod_bits = 0;
@@ -719,7 +720,7 @@
      we'll actually use backup_suffix_string.  */
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
 
-  while ((c = getopt_long (argc, argv, "abdfHilLprsuvxPRS:V:", long_opts, NULL))
+  while ((c = getopt_long (argc, argv, "abdDfHilLprsuvxPRS:V:", long_opts, NULL))
         != -1)
     {
       switch (c)
@@ -759,6 +760,10 @@
          x.dereference = DEREF_NEVER;
          break;
 
+       case 'D':
+         x.dotted_copy_style = 1;
+         break;
+
        case 'f':
          x.unlink_dest_after_failed_open = 1;
          break;
diff -Nur file_orig/src/mv.c file_new/src/mv.c
--- file_orig/src/mv.c  2001-02-03 17:48:34.000000000 +0100
+++ file_new/src/mv.c   2002-09-18 19:41:20.000000000 +0200
@@ -122,6 +122,7 @@
   x->symbolic_link = 0;
   x->set_mode = 0;
   x->mode = 0;
+  x->dotted_copy_style = 0;
 
   /* Find out the current file creation mask, to knock the right bits
      when using chmod.  The creation mask is set to be liberal, so
@@ -394,7 +395,7 @@
 
   errors = 0;
 
-  while ((c = getopt_long (argc, argv, "bfiuvS:V:", long_options, NULL)) != -1)
+  while ((c = getopt_long (argc, argv, "bDfiuvS:V:", long_options, NULL)) != -1)
     {
       switch (c)
        {
@@ -413,6 +414,9 @@
          if (optarg)
            version_control_string = optarg;
          break;
+       case 'D':
+         x.dotted_copy_style = 1;
+         break;
        case 'f':
          x.interactive = 0;
          break;

Attachment: msg02085/pgp00000.pgp
Description: PGP signature

_______________________________________________
Bug-fileutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-fileutils

Reply via email to