Files
MajorWiki/03-opensource/dev-tools/rsync.md
MajorLinux 6da77c2db7 wiki: remove Obsidian-style hashtag tags from 12 articles
These #hashtag tag lines render as plain text on MkDocs. All articles
already have tags in YAML frontmatter, so the inline tags were redundant.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:03:28 -04:00

2.4 KiB

rsync — Fast, Resumable File Transfers

Problem

Copying large files or directory trees between drives or servers is slow, fragile, and unresumable with cp. A dropped connection or a single error means starting over. You also want to skip files that already exist at the destination without re-copying them.

Solution

rsync is a file synchronization tool that only transfers what has changed, preserves metadata, and can resume interrupted transfers. It works locally and over SSH.

Installation (Fedora)

sudo dnf install rsync

Basic Local Copy

rsync -av /source/ /destination/
  • -a — archive mode: preserves permissions, timestamps, symlinks, ownership
  • -v — verbose: shows what's being transferred

Trailing slash on source matters:

  • /source/ — copy the contents of source into destination
  • /source — copy the source directory itself into destination

Resume an Interrupted Transfer

rsync -av --partial --progress /source/ /destination/
  • --partial — keeps partially transferred files so they can be resumed
  • --progress — shows per-file progress and speed

Skip Already-Transferred Files

rsync -av --ignore-existing /source/ /destination/

Useful when restarting a migration — skips anything already at the destination regardless of timestamp comparison.

Dry Run First

Always preview what rsync will do before committing:

rsync -av --dry-run /source/ /destination/

No files are moved. Output shows exactly what would happen.

Transfer Over SSH

rsync -av -e ssh /source/ user@remotehost:/destination/

Or with a non-standard port:

rsync -av -e "ssh -p 2222" /source/ user@remotehost:/destination/

Exclude Patterns

rsync -av --exclude='*.tmp' --exclude='.Trash*' /source/ /destination/

Real-World Use

Migrating ~286 files from /majorRAID to /majorstorage during a RAID dissolution project:

rsync -av --partial --progress --ignore-existing \
  /majorRAID/ /majorstorage/ \
  2>&1 | tee /root/raid_migrate.log

Run inside a tmux or screen session so it survives SSH disconnects:

tmux new-session -d -s rsync-migrate \
  "rsync -av --partial --progress /majorRAID/ /majorstorage/ | tee /root/raid_migrate.log"

Check Progress on a Running Transfer

tail -f /root/raid_migrate.log