How to show the transfer progress and speed when copying files with cp?
While cp
hasn't got this functionality, you can use pv
to do this:
pv my_big_file > backup/my_big_file
Note: this method will lose the file's permissions and ownership. Files copied this way will have the same permissions as if you'd created them yourself and will belong to you.
In this example, pv
basically just outputs the file to stdout*, which you redirect to a file using the >
operator. Simultaneously, it prints information about the progress to the terminal when you do that.
This is what it looks like:
stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
138MB 0:00:01 [73.3MB/s] [=================================>] 100%
You may need to Install pv (alternatively, type sudo apt-get install pv
) on your system.
*: The technical bit
There are three important streams of data in a unix-like system: stdout (standard output), stderr (standard error) and stdin (standard input). Every program has all three, so to speak. The >
redirection operator redirects program output to a file. Without arguments, as you see above, >
redirects a program's standard output to a file. cp
basically does nothing fancier than
cat source > destination
(where cat
just reads a file and prints it to stdout). pv
is just like cat, but if you redirect it's output stream somewhere else, it will print progress information to stdout instead.
Take a look at man pv
to learn more about it.
Another option, as DoR suggests in this answer, is to use rsync instead:
$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
621.22M 57% 283.86MB/s 0:00:01
This will preserve the files permissions/ownership while showing progress.
There isn't. See here as to why. Although it does more than you need, rsync
has a --progress
parameter. The -a
will keep permissions,etc, and -h
will be human readable.
rsync -ah --progress source destination
The output will look something like this:
Pictures/1.jpg
2.13M 100% 2.28MB/s 0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
1.68M 100% 1.76MB/s 0:00:00 (xfr#5899, to-chk=0/5905)
If you want to see if your files are transferring correctly you could use gcp
and gcp
is like cp but by default gives you a progress bar so that you can see what is being copied. As the program's wiki notes, gcp
has several useful features such as
- transfer progression indication
- continuous copying on error (skip to next file)
- copy status logging: gcp logs all its actions so that it is possible to know which files have been successfully copied
- name mangling to handle target filesystem limitations (for example deletion of incompatible characters "*" or "?" on FAT)
However, even when the progress bar has reached 100% when using the tool, you must wait until your terminal prompt reappears before safely removing your media so that you can ensure that the transfer process has successfully finished.
gcp
is used to copy files and has options such as --preserve
so that various attributes and permissions can be preserved and --recursive
so that whole directories can be copied. More information on its options can be found by entering man gcp
or by going to the Ubuntu manpages online. A tutorial is also available on this site.
Install gcp
from the repositories with
sudo apt-get install gcp
(Note: in Ubuntu 12.10 the new automount point is, for example, /media/user/usbdisk
)
You can copy a file to your media by entering
gcp /home/mike/file.mp4 /media/usb
and copy a folder to your media with
gcp -rv ~/Podcasts /media/Mik2
Sample output from gcp
with the progress bar:
gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################| 7.98 M/s Time: 00:00:22
You can of course specify multiple files or folders to copy to your disk, and there are a lot of other options covered in man gcp
.