It seems, rsync with an -a (archive, i.e. recursive through directories, and preserve permissions and symlinks etc, leave everything as much as it is as possible) and a -u (update, i.e. always preserve newer version) flags would do the job. (Perhaps a -v flag for verbose)
E.g.
rsync -auv /path/to/source/dir/ /path/to/target/dir/
or, if it is remote, you can also specify with the -e flag what remote shell you would like to use, e.g. with ssh
rsync -auv -e "ssh" /path/to/source/dir/ remoteusername@remoteserver:/target/path/on/remote/machine/
or the other way around
rsync -auv -e "ssh" remoteusername@remoteserver:/source/path/on/remote/machine/ /path/to/local/target/dir/
(Perhaps you might want to try with two test directories first to verify that it works before doing something that could overwrite something that is important and could thus do serious damage.)