- Fixed 4 broken markdown links (bad relative paths in See Also sections) - Corrected n8n port binding to 127.0.0.1:5678 (matches actual deployment) - Updated SnapRAID article with actual majorhome paths (/majorRAID, disk1-3) - Converted 67 Obsidian wikilinks to relative markdown links or plain text - Added YAML frontmatter to 35 articles missing it entirely - Completed frontmatter on 8 articles with missing fields Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
108 lines
2.6 KiB
Markdown
108 lines
2.6 KiB
Markdown
---
|
|
title: "rsync — Fast, Resumable File Transfers"
|
|
domain: opensource
|
|
category: dev-tools
|
|
tags: [rsync, backup, file-transfer, linux, cli]
|
|
status: published
|
|
created: 2026-04-02
|
|
updated: 2026-04-02
|
|
---
|
|
# 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)
|
|
|
|
```bash
|
|
sudo dnf install rsync
|
|
```
|
|
|
|
### Basic Local Copy
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
rsync -av --dry-run /source/ /destination/
|
|
```
|
|
|
|
No files are moved. Output shows exactly what would happen.
|
|
|
|
### Transfer Over SSH
|
|
|
|
```bash
|
|
rsync -av -e ssh /source/ user@remotehost:/destination/
|
|
```
|
|
|
|
Or with a non-standard port:
|
|
|
|
```bash
|
|
rsync -av -e "ssh -p 2222" /source/ user@remotehost:/destination/
|
|
```
|
|
|
|
### Exclude Patterns
|
|
|
|
```bash
|
|
rsync -av --exclude='*.tmp' --exclude='.Trash*' /source/ /destination/
|
|
```
|
|
|
|
### Real-World Use
|
|
|
|
Migrating ~286 files from `/majorRAID` to `/majorstorage` during a RAID dissolution project:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
tmux new-session -d -s rsync-migrate \
|
|
"rsync -av --partial --progress /majorRAID/ /majorstorage/ | tee /root/raid_migrate.log"
|
|
```
|
|
|
|
### Check Progress on a Running Transfer
|
|
|
|
```bash
|
|
tail -f /root/raid_migrate.log
|
|
```
|
|
|
|
---
|