Make a Backup With Rsync
We want to make a backup of data, for example to an external hard drive. Rsync to the rescue.
The basic command
Assuming we are in someone’s home directory and we want to copy three
source directories Music
, Documents
and Movies
to a destination
directory /mnt/external-hdd
:
$ rsync -a Music Documents Movies /mnt/external-hdd
A word on slashes
Notice that we omit the trailing forward slash /
on the source
directories. This means the destination will look like:
/mnt/external-hdd
|-- Music
| |-- a.mp3
|-- Documents
| |-- b.txt
|-- Movies
| |-- c.mp4
If we were to add trailing forward slashes, the upper-level source directories would not be copied and the result would look like:
/mnt/external-hdd
|-- a.mp3
|-- b.txt
|-- c.mp4
Read more about slashes in
rsync
.
The rsync -a
command broken down
rsync -a
is equal to rsync --archive
and is a convenience command.
According to the man page, it equals rsync -rlptgoD
.
-r
or--recurse
: recursively copy data-l
or--links
: copy symlinks as symlinks-p
or--perms
: preserve permissions-t
or--times
: preserve modifications times-g
or--group
: preserve the group-o
or--owner
: preserve owner-D
is the same as--devices --specials
:--devices
: preserve device files--specials
: preserve special files
[…] a device file or special file is an interface to a device driver that appears in a file system as if it were an ordinary file
Device files in Linux are usually found under the /dev
directory.
See the overall progress of rsync
By default, rsync
will show the progress of the individual files that
are being copied. If you want the overall progress, you have to add some
flags:
$ rsync -a --info=progress2 --no-i-r src dst
--info=progress2
shows the total transfer progress. (To see all
available options for --info
, execute rsync --info=help
). --no-i-r
is short for --no-inc-recursive
and disables incremental recursion,
forcing rsync
to do a complete scan of of all directories before
starting the file transfer. This is needed to get an accurate progress
report, otherwise rsync
doesn’t know how much work is left.
Human-readable output can be obtained by passing the -h
or
--human-readable
option.
For a discussion of these options, see also this StackOverflow post.