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.