Copying in Linux with Visual Progress

1. Overview

In this tutorial, we’ll learn how to display copy progress and speed on Linux.

2. Single File

rsync is a file-copying tool that works for remote as well as local copies. It isn’t always installed by default, but it’s a popular tool and can be installed from standard repositories.

Let’s use rsync to copy a single file while displaying progress. The destination can be a file or a directory:

rsync --progress /path/to/source-file /path/to/destination
source-file
    264,601,600  25%  126.22MB/s    0:00:06

We see the number of bytes copied so far, the progress percentage, speed, and time remaining.

3. Directory

Let’s copy a directory using rsync while displaying the progress:

rsync -r --progress /path/to/source-dir /path/to/destination-dir
sending incremental file list
created directory /path/to/destination-dir
source-dir/
source-dir/1
    104,857,600 100%  261.70MB/s    0:00:00 (xfr#1, to-chk=8/10)
source-dir/2
    104,857,600 100%  102.46MB/s    0:00:00 (xfr#2, to-chk=7/10)
source-dir/3
    104,857,600 100%   58.11MB/s    0:00:01 (xfr#3, to-chk=6/10)
...

We can see that for recursive copy, rsync will show progress info for each file separately. What if we want to see overall progress instead?

Let’s use a different option to see overall progress:

rsync -r --info=progress2 /path/to/source-dir /path/to/destination-dir
    423,297,024  44%  134.64MB/s    0:00:03  (xfr#4, to-chk=5/10)

This command will copy source-dir inside destination-dir. We can see the number of bytes copied, overall completion percentage, the total rate of transfer, and the time remaining. xfr#4 means four files were transferred so far, to-chk=5/10 means that out of ten files, five remain to be checked by rsync to see if they’re up to date.

We should be aware that putting a slash at the end of source-dir will make rsync behave differently. This will copy the contents of source-dir, not source-dir itself:

rsync -r --info=progress2 /path/to/source-dir/ /path/to/destination-dir

4. Other Methods

We might not think of using curl, the URL transfer tool, to copy a file locally. It’s possible, but for only one file at a time:

curl -o /path/to/destination-file file:///path/to/source-file
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 17 1000M   17  173M    0     0   518M      0  0:00:01 --:--:--  0:00:01  518M

Let’s use progress, a tool that will display the progress of basic commands already running, like cp, mv, dd, tar or gzip:

progress -M
[ 2498] cp /path/to/source-file
        80.7% (806.9 MiB / 1000 MiB) 245.0 MiB/s

Finally, let’s try lsof, which can also be used to get information about a copy that’s already in progress. We can monitor the changes using watch:

watch lsof /path/to/destination
COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF   NODE NAME
cp      2197 root    4w   REG    8,2 650133504 539646 /path/to/destination

5. Conclusion

In this quick article, we learned how to see progress while copying files and directories on Linux.