Skip to main content

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

Screenshot 2022-10-04 230859.png

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)