[PATCH] cp/mv display progress

Benjamin Schieder <[email protected]>
Newsgroups gmane.comp.gnu.fileutils.bugs
Message-ID <[email protected]>
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"

_______________________________________________
Bug-fileutils mailing list
[email protected]
http://mail.gnu.org/mailman/listinfo/bug-fileutils
cpmv_D_switch.diff (text/plain, 3.6 KB)
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;
signature.asc (application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+LQiA8fXU8Im7UWwRAtSkAJ9OxchyoSSHZ9NWMDYtPsclCVZ6gACgjviV
+F6KhP3G9rxDYmeXVDo/jq4=
=rxWP
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.