Nowadays Linux system admins have a lot of tools and options to facilitate the transfer of data and files from and to servers. SSH and FTP are the most popular protocols for data transfer. FTP, in one hand, is popular due to its ease of use but, on the other hand, SSH is far more secure and reliable.
For SSH-based data transfer scp and sftp are two specialized tools used by system admins for many years. However, none of these offer all the features and capabilities that rsync provides.
In this tutorial we will explain how Rsync works and how you can use it for transferring files and folders from and to Linux Servers. In the end of this tutorial you can also find an Rsync Cheat Sheet with explanation of rsync command parameters.
What is RSync
rsync is a utility for efficiently transferring and synchronizing files between computers and servers across local and public networks (source: https://en.wikipedia.org/wiki/Rsync). Rsync stands for “remote sync” and it uses an algorithm that minimizes the amount of data copied by only transferring files which have changed.
How to Install Rsync on Linux Server
To install Rsync on your Linux server, you can use the following commands below according to your Linux distribution:
sudo apt-get install rsync // for Debian/Ubuntu pacman -S rsync // for Arch Linux sudo dnf install rsync // for Fedora/CentOS/RHEL and Rocky Linux/AlmaLinux
Example 1: Copy an Entire Directory from Local Server to a Remote Server
Assuming you are connected on a Server A and you wish to transfer an entire directory named public_html which is under “/home” to a Server B (IP: 192.168.1.3), you can use the following command:
rsync -arvzh /home/public_html root@192.168.1.3:/home/
Example 2: Copy a Directory from Remote Server to a Local machine
The following command will help you sync the entire directory /var/backup from a remote server (IP: 192.168.1.3) to a server you are currently connected:
rsync -arvzh root@192.168.1.3:/var/backup /var/
Example 3: Use RSync for Files Transfer between Servers with Custom SSH Port
If you wish to transfer files to a Server which uses a non-standard SSH Port, then you need to supply the rsync command with the -e argument and specify the custom SSH port that the destination server uses. In our example below we assume that the SSH port is 2222, and we are going to transfer the file /home/public_html/index.html.
rsync -avzh -e 'ssh -p 2222' /home/public_html/index.html root@192.168.1.3:/home/public_html/
Example 4: Automatically Delete Files on Source Server after Successful Transfer
In cases when you are initiating data transfer for, lets say, backup purposes you may want to have the files on the originating server deleted after they have been transferred to the backup/destination server.
rsync -avzh --remove-source-files /root/backup.tar.gz root@192.168.1.3:/root/
Example 5: Test RSync Command with Dry Run
If you are not yet familiar with rsync, you may not want to execute commands that may mess up your data on source or destination servers. In this case, rsync provides a wonderful parameter that will not make any real changes but instead will show the output of what your command would do.
rsync -avzh --dry-run /root/backup.tar.gz root@192.168.1.3:/root/
Sample Output:
[root@ubuntu-server:~]# rsync --dry-run --remove-source-files -zvh /root/backup.tar.gz root@192.168.1.3:/root/
root@192.168.1.3's password:
backup.tar.gz
sent 50 bytes received 94 bytes 95.15 bytes/sec
total size is 267.30K speedup is 3,873.97 (DRY RUN)
Rsync Cheat Sheet
Here is a cheat sheet for all rsync’s arguments which you may need to supply in your command for data transfer/sync.
-v, –verbose | increase verbosity |
-q, –quiet | suppress non-error messages |
–no-motd | suppress daemon-mode MOTD (see caveat) |
-c, –checksum | skip based on checksum, not mod-time & size |
-a, –archive | archive mode; equals -rlptgoD (no -H,-A,-X) |
–no-OPTION | turn off an implied OPTION (e.g., –no-D) |
-r, –recursive | recurse into directories |
-R, –relative | use relative path names |
–no-implied-dirs | don’t send implied dirs with –relative |
-b, –backup | make backups (see –suffix & –backup-dir) |
–backup-dir=DIR | make backups into hierarchy based in DIR |
–suffix=SUFFIX | backup suffix (default ~ w/o –backup-dir) |
-u, –update | skip files that are newer on the receiver |
–inplace | update destination files in-place |
–append | append data onto shorter files |
–append-verify | –append w/old data in file checksum |
-d, –dirs | transfer directories without recursing |
-l, –links | copy symlinks as symlinks |
-L, –copy-links | transform symlink into referent file/dir |
–copy-unsafe-links | only “unsafe” symlinks are transformed |
–safe-links | ignore symlinks that point outside the tree |
-k, –copy-dirlinks | transform symlink to dir into referent dir |
-K, –keep-dirlinks | treat symlinked dir on receiver as dir |
-H, –hard-links | preserve hard links |
-p, –perms | preserve permissions |
-E, –executability | preserve executability |
–chmod=CHMOD | affect file and/or directory permissions |
-A, –acls | preserve ACLs (implies -p) |
-X, –xattrs | preserve extended attributes |
-o, –owner | preserve owner (super-user only) |
-g, –group | preserve group |
–devices | preserve device files (super-user only) |
–specials | preserve special files |
-D | same as –devices –specials |
-t, –times | preserve modification times |
-O, –omit-dir-times | omit directories from –times |
–super | receiver attempts super-user activities |
–fake-super | store/recover privileged attrs using xattrs |
-S, –sparse | handle sparse files efficiently |
-n, –dry-run | perform a trial run with no changes made |
-W, –whole-file | copy files whole (w/o delta-xfer algorithm) |
-x, –one-file-system | don’t cross filesystem boundaries |
-B, –block-size=SIZE | force a fixed checksum block-size |
-e, –rsh=COMMAND | specify the remote shell to use |
–rsync-path=PROGRAM | specify the rsync to run on remote machine |
–existing | skip creating new files on receiver |
–ignore-existing | skip updating files that exist on receiver |
–remove-source-files | sender removes synchronized files (non-dir) |
–del | an alias for –delete-during |
–delete | delete extraneous files from dest dirs |
–delete-before | receiver deletes before transfer, not during |
–delete-during | receiver deletes during the transfer |
–delete-delay | find deletions during, delete after |
–delete-after | receiver deletes after transfer, not during |
–delete-excluded | also delete excluded files from dest dirs |
–ignore-errors | delete even if there are I/O errors |
–force | force deletion of dirs even if not empty |
–max-delete=NUM | don’t delete more than NUM files |
–max-size=SIZE | don’t transfer any file larger than SIZE |
–min-size=SIZE | don’t transfer any file smaller than SIZE |
–partial | keep partially transferred files |
–partial-dir=DIR | put a partially transferred file into DIR |
–delay-updates | put all updated files into place at end |
-m, –prune-empty-dirs | prune empty directory chains from file-list |
–numeric-ids | don’t map uid/gid values by user/group name |
–timeout=SECONDS | set I/O timeout in seconds |
–contimeout=SECONDS | set daemon connection timeout in seconds |
-I, –ignore-times | don’t skip files that match size and time |
–size-only | skip files that match in size |
–modify-window=NUM | compare mod-times with reduced accuracy |
-T, –temp-dir=DIR | create temporary files in directory DIR |
-y, –fuzzy | find similar file for basis if no dest file |
–compare-dest=DIR | also compare received files relative to DIR |
–copy-dest=DIR | … and include copies of unchanged files |
–link-dest=DIR | hardlink to files in DIR when unchanged |
-z, –compress | compress file data during the transfer |
–compress-level=NUM | explicitly set compression level |
–skip-compress=LIST | skip compressing files with suffix in LIST |
-C, –cvs-exclude | auto-ignore files in the same way CVS does |
-f, –filter=RULE | add a file-filtering RULE |
-F | same as –filter=’dir-merge /.rsync-filter’ repeated: –filter=’- .rsync-filter’ |
–exclude=PATTERN | exclude files matching PATTERN |
–exclude-from=FILE | read exclude patterns from FILE |
–include=PATTERN | don’t exclude files matching PATTERN |
–include-from=FILE | read include patterns from FILE |
–files-from=FILE | read list of source-file names from FILE |
-0, –from0 | all *from/filter files are delimited by 0s |
-s, –protect-args | no space-splitting; wildcard chars only |
–address=ADDRESS | bind address for outgoing socket to daemon |
–port=PORT | specify double-colon alternate port number |
–sockopts=OPTIONS | specify custom TCP options |
–blocking-io | use blocking I/O for the remote shell |
–stats | give some file-transfer stats |
-8, –8-bit-output | leave high-bit chars unescaped in output |
-h, –human-readable | output numbers in a human-readable format |
–progress | show progress during transfer |
-P | same as –partial –progress |
-i, –itemize-changes | output a change-summary for all updates |
–out-format=FORMAT | output updates using the specified FORMAT |
–log-file=FILE | log what we’re doing to the specified FILE |
–log-file-format=FMT | log updates using the specified FMT |
–password-file=FILE | read daemon-access password from FILE |
–list-only | list the files instead of copying them |
–bwlimit=KBPS | limit I/O bandwidth; KBytes per second |
–write-batch=FILE | write a batched update to FILE |
–only-write-batch=FILE | like –write-batch but w/o updating dest |
–read-batch=FILE | read a batched update from FILE |
–protocol=NUM | force an older protocol version to be used |
–iconv=CONVERT_SPEC | request charset conversion of file names |
–checksum-seed=NUM | set block/file checksum seed (advanced) |
-4, –ipv4 | prefer IPv4 |
-6, –ipv6 | prefer IPv6 |
–version | print version number |
-h, –help | show help |