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) |