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.
-ror--recurse: recursively copy data-lor--links: copy symlinks as symlinks-por--perms: preserve permissions-tor--times: preserve modifications times-gor--group: preserve the group-oor--owner: preserve owner-Dis 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.