rsync - Easily Transfer and Synchronize Files Between Computers
rsync is a great utility that can be use for transferring files to and from a remote computer. It can be use to sync files between the computers as well.
rsync can be installed from the package manager on a Debian system:
sudo apt install rsync -y
The basic syntax for rsync is as follows:
rysnc -optional-flags soruce-file-location destination-file-location
One of the rsync command I prefer to use is the following:
#Sync file from source to destination, keeping source file attributes, show human readable progress,
#and delete files afterwards from destination if file exisits in destination but not in source
rsync -ah -r --progress source-file destination-file --delete-after
rsync Flags Reference
rsync have many possible flags to use. Below are a list of the flags according to the official manual:
Flags | Shorthand |
Description |
--verbose |
-v |
increase verbosity |
--quiet | -q | suppress non-error messages |
--no-motd | suppress daemon-mode MOTD (see caveat) | |
--checksum | -c | skip based on checksum, not mod-time & size |
--archive | -a | archive mode; equals -rlptgoD (no -H,-A,-X) |
--no-OPTION | turn off an implied OPTION (e.g. --no-D) | |
--recursive | -r | recurse into directories |
--relative | -R | use relative path names |
--no-implied-dirs | don't send implied dirs with --relative | |
--backup | -b | 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) | |
--update | -u | 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 | |
--dirs | -d | transfer directories without recursing |
--links | -l | copy symlinks as symlinks |
--copy-links | -L | transform symlink into referent file/dir |
--copy-unsafe-links | only "unsafe" symlinks are transformed | |
--safe-links | ignore symlinks that point outside the tree | |
--copy-dirlinks | -k | transform symlink to dir into referent dir |
--keep-dirlinks | -K | treat symlinked dir on receiver as dir |
--hard-links | -H | preserve hard links |
--perms | -p | preserve permissions |
--executability | -E | preserve executability |
--chmod=CHMOD | affect file and/or directory permissions | |
--acls | -A | preserve ACLs (implies -p) |
--xattrs | -X | preserve extended attributes |
--owner | -o | preserve owner (super-user only) |
--group | -g | preserve group |
--devices | preserve device files (super-user only) | |
--specials | preserve special files | |
-D | same as --devices --specials | |
--times | -t | preserve modification times |
--omit-dir-times | -O | omit directories from --times |
--super | receiver attempts super-user activities | |
--fake-super | store/recover privileged attrs using xattrs | |
--sparse | -S | handle sparse files efficiently |
--dry-run | -n | perform a trial run with no changes made |
--whole-file | -W | copy files whole (w/o delta-xfer algorithm) |
--one-file-system | -x | don't cross filesystem boundaries |
--block-size=SIZE | -B | force a fixed checksum block-size |
--rsh=COMMAND | -e | 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 (default) | |
--delete-during | receiver deletes during xfer, not before | |
--delete-delay | find deletions during, delete after | |
--delete-after | receiver deletes after transfer, not before | |
--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 | |
--prune-empty-dirs | -m | 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 | |
--ignore-times | -I | 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 | |
--temp-dir=DIR | -T | create temporary files in directory DIR |
--fuzzy | -y | 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 | |
--compress | -z | compress file data during the transfer |
--compress-level=NUM | explicitly set compression level | |
--skip-compress=LIST | skip compressing files with suffix in LIST | |
--cvs-exclude | -C | auto-ignore files in the same way CVS does |
--filter=RULE | -f | 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 | |
--from0 | -0 | all *from/filter files are delimited by 0s |
--protect-args | -s | 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-bit-output | -8 | leave high-bit chars unescaped in output |
--human-readable | -h | output numbers in a human-readable format |
--progress | show progress during transfer | |
-P | same as --partial --progress | |
--itemize-changes | -i | 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 filenames | |
--checksum-seed=NUM | set block/file checksum seed (advanced) | |
--ipv4 | -4 | prefer IPv4 |
--ipv6 | -6 |
prefer IPv6 |
--version | print version number | |
--help | (-h) | show this help (see below for -h comment) |