scp & rsync — Remote File Transfer
Copy files between local and remote machines using scp for quick copies and rsync for efficient incremental syncing.
March 13, 20255 min read
linuxnetworkingscprsyncfile-transfer
scp — Secure Copy
scp copies files over SSH. Simple to use but copies everything every time (no incremental).
# Local → Remote
scp file.txt user@server:/path/to/dest/
scp -r folder/ user@server:/path/to/dest/ # Recursive
# Remote → Local
scp user@server:/path/to/file.txt ./
scp -r user@server:/path/to/folder/ ./
# Remote → Remote
scp user@server1:/file.txt user@server2:/dest/
# Custom SSH port
scp -P 2222 file.txt user@server:/dest/rsync — Smart Sync
rsync only transfers changed data — much faster than scp for regular syncs. It also supports compression, deletion, and dry runs.
# Local → Remote
rsync -avz folder/ user@server:/dest/
# Remote → Local
rsync -avz user@server:/path/ ./local/
# Dry run — preview without transferring
rsync -avzn folder/ user@server:/dest/
# Delete files not in source (mirror)
rsync -avz --delete folder/ user@server:/dest/
# Exclude patterns
rsync -avz --exclude='node_modules' --exclude='.git' ./ user@server:/dest/
# Show progress
rsync -avz --progress folder/ user@server:/dest/
# Custom SSH port
rsync -avz -e "ssh -p 2222" folder/ user@server:/dest/rsync Flags
| Flag | Description |
|---|---|
-a | Archive (preserves permissions, timestamps) |
-v | Verbose |
-z | Compress during transfer |
-n | Dry run |
--delete | Delete extra files at destination |
--progress | Show progress |
scp vs rsync
| Feature | scp | rsync |
|---|---|---|
| Incremental | ❌ Full copy | ✅ Only changes |
| Resume | ❌ No | ✅ Yes |
| Compression | ❌ No | ✅ Yes |
| Mirror/delete | ❌ No | ✅ Yes |
| Simplicity | ✅ Simple | Slightly more complex |
Use rsync for regular backups and syncing. Use scp for one-off quick copies. Always do a dry run with -n before using --delete.
Quick Check
Which rsync flag performs a dry run (no actual transfer)?
Exercise
Create a directory ~/test-rsync/ with a few files. Use rsync to copy it to /tmp/rsync-dest/ with verbose and compression flags.