Linux: rsync Tutorial
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/ joe@example.org:~/
This will 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 on windows path
on Microsoft Windows, the path with drive letter:
c:/
should be replaced by
/cygdrive/c/
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).
-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
.
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/ joe@example.com:~/
--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
--delete
- 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@169.254.125.147:~/web/
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" joe@example.org:~/web/ ~/
This will get everything from the remote machine, to local machine.