rsync to remote server via ssh


If you ever need to repeatedly upload to a remote server, here is the command line of the day:

rsync -zrptL --delete-after -e "ssh" --include=core --include=tags --exclude=.DS_Store --cvs-exclude /local/dir user@host:/remote/dir/

rsync sends only the files that have changed. I just tried rsync today for the first time and I'm impressed. Its far faster than all of the ftp based synchronization tools I've used. Unfortunately, it only goes in one direction. Here are the meanings of the options:

z - use compression
r - recurse directories
p - preserve permissions
t - preserve times
L - copy (flatten) symbolic links

--delete-after - gets rid of any files in the remote directory that are not in the local directory. It prevents old files from getting orphaned on the server.

Put any ssh parameters you need inside the quotes.

I develop on Mac OS X, so --exclude=.DS_Store gets rid of those annoying little files.

--cvs-exclude gets rid of all the crud that CVS leaves lying around.

--include=core and --include=tags are my very hard won lesson of today. My program has a core and a tags directory. Tags is a special directory for cvs and removed by the --cvs-exclude option. Any file or directory named core is also removed by this option. --include puts em back. The other --cvs-exclude patterns are less likely to collide. I think --include has to come before the --cvs-exclude on the command line.

The trailing slash (or absence of one) on the source and destination directories matter.