Linux: rsync Tutorial

By Xah Lee. Date: . Last updated: .

What is Rsync

rsync is a command line util that lets you do one-way copying/updating from one machine to another.

The remote machine must also have rsync installed. (it's installed by default in linux)

Rsync Examples

# copy the local dir
# ~/web/
#  to the remote dir
# ~/
# on the machine with domain name “example.org”, using login joe
# via the ssh protocol

rsync -z -a -v -t --rsh="ssh -l joe" ~/web/ joe@example.org:~/
# rsync example. sync/upload my website on my local machine to my web server

# but use --exclude to exclude some dir or files on source dir
# use --delete to delete files on target that are not in source

rsync -z -a -v -t --exclude="*~"  --exclude=".DS_Store" --exclude=".bash_history"  --exclude="*/_curves_robert_yates/*.png" --exclude="logs/*"  --exclude="xlogs/*" --delete --rsh="ssh -l joe" ~/web/ joe@example.com:~/
# rsync from Windows to Mac
# use -r instead -a

rsync -z -r -v --delete --rsh="ssh -l xah" ~/web/ xah@169.254.125.147:~/web/

Rsync Options

Here's what the options mean:

-a
Archived mode, basically making the file's meta data (owner/perm/timestamp) same as the local file (when possible) and do recursive (i.e. Upload the whole dir).

Tip: use this ONLY between linux and Mac machines. Because Windows and unix have different file permission systems. [see Linux: File Permission System] If any machine is Microsoft Windows, use -r instead.

-r
“recursive”, all sub directories and files
-z
Use compression for transmission. (compress files first, transmit, uncompress. This saves bandwidth.)
-v
Verbose mode. Print out which files is being updated.
-t
Copy timestamp from source to destination. If you don't, rsync will basically update every file. Timestamp is used by rsync to check if file's been updated. -a implies -t.
--exclude=glob_pattern
Ignore file names that matches glob_pattern in source directory. (i.e. If it matches, don't upload it, nor delete it on remote server) For example, *.javac means all files ending in .javac

you can have multiple exclude.

--exclude='logs/' --exclude='.git/' --exclude='xx*' --exclude='*~' --exclude='.DS_Store'

--delete
If a file/dir in destination is not in source directory, delete it.

rsync on windows path

on Microsoft Windows, the path with drive letter c:/ should be replaced by

/cygdrive/c/

rsync remote to local

Here's a example of reverse direction.

rsync -z -a -v -t --rsh="ssh -l joe" joe@example.org:~/web/ ~/

This will get everything from the remote machine, to local machine.

Linux, Files and Dirs