Linux: rsync Tutorial

By Xah Lee. Date: . Last updated: .

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 -z -a -v -t --rsh="ssh -l joe" ~/web/

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

rsync on windows path

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

Here's what the options mean:

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).
Use compression for transmission. (compress files first, transmit, uncompress. This saves bandwidth.)
Verbose mode. Print out which files is being updated.
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.

For example, here's what i use to sync/upload my website on my local machine to my server.

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/
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
If a file/dir in destination is not in source directory, delete it.

Here's a example of syncing Windows and Mac.

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

Note that -r is used instead of -a. The -r means recursive, all sub directories and files. Don't use -a because that will sync file owner, group, permissions, and others, but because Windows and unix have different permission systems and file systems, so -a is usually not what you want.

[see Linux: File Permission System]

rsync remote to local

Here's a example of reverse direction.

rsync -z -a -v -t --rsh="ssh -l joe" ~/

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

Compare Directories

Linux: diff, Compare Files/Dirs

Linux Shell Basics

Directory and Files

Compress, Archive, Download

Text Processing

User, Group, File Perm


Process, Job Control


Linux Desktop