I recently discovered a tool which turned out to be useful for backing up my local folders, namely: rsync. It’s a straightforward command-line utility that makes it really easy to maintain a mirror of local data on any distant support. Basic usage for this purpose is:
$ rsync -auvz --delete ./local-folder/ /mnt/remote-folder/
- -a stands for "archive" mode (preserve permissions, dates, etc.),
- -u stands for "update" only, i.e. don’t re-send or overwrite newer files,
- -v stands for "verbose", so we can see a list of files being processed,
- -z enables file compression for faster transfers,
- --delete means we delete files that don’t exist any more in the local folder.
The verbose mode enabled by -v is not necessary depending on your use case. These other parameters can also come in handy:
- --exclude can be used to specify files or filename patterns to ignore,
- --progress displays a progression bar, e.g. to check that a big file transfer is not hanging.
Check out man rsync for more details and options.
The only thing to be careful about with rsync is the addition, or not, of a trailing slash. If there is no trailing slash, the corresponding object is treated as a target, while if there is a trailing slash, the corresponding object is treated as a directory containing the target files. It's clearer with an example: suppose we have a directory foo containing the file README, and we want to sync it to a directory bar. If we do:
$ rsync -auvz ./foo ./bar/
Then foo will be copied to the target location bar/, and we will end up with the following file tree:
./foo ./foo/README ./bar/ ./bar/foo ./bar/foo/README
On the contrary, if we do:
$ rsync -auvz ./foo/ ./bar/
Then the content of foo is synced with the content of bar, and we get:
./foo ./foo/README ./bar/ ./bar/README
So, make sure that the source and destination folders are consistent trailing-slash-wise.