【完全比較】scp vs rsync ファイル転送はどちらを使うべきか

【完全比較】scp vs rsync ファイル転送はどちらを使うべきか

Linux でファイルをネットワーク経由でコピーする代表的な2つのコマンド:

# scp(Secure Copy)
scp file.txt user@server:/path/

# rsync(Remote Sync)
rsync -avz file.txt user@server:/path/

どちらもSSH 経由で安全に転送できます。しかし、

  • どっちを使えばいい?
  • rsync の -avz って何?
  • 中断した転送を続きから再開できる?
  • 差分だけ転送したい
  • サーバー間のディレクトリを完全同期したい
  • 特定ファイルを除外したい
  • 「scp は非推奨になった」と聞いたけど本当?
  • 帯域制限をかけたい
  • 巨大ファイルを何度も転送するのが辛い

など、いざ本格的な運用になると悩ましいポイントが多く出てきます。

さらに、2022年の OpenSSH 9.0 で scp の基盤プロトコルが非推奨となり、scp コマンドは内部的にSFTP を使うように変更されました。この変化を知らずに使っている方も多いはず。

本記事では、scprsyncすべての違いと使い分けを、リファレンスとして実用的に整理します。基本コマンド、オプション詳解(-a/-v/-z/--exclude/--delete/--dry-run)、差分転送の仕組み、SSH連携、実践シナリオ、パフォーマンス、トラブルシューティング、FAQまで完全網羅。この1本でファイル転送の悩みが解消されます。


目次

結論:3秒で分かる使い分け

時間がない方向けに、最重要ポイントを先に示します。

早見表

観点scprsync
転送方式全ファイル毎回コピー差分のみ転送
中断からの再開❌(最初から)
除外パターン--exclude
削除同期--delete
圧縮SSH設定依存-z
進捗表示限定的--progress
dry-run--dry-run
プロトコルSSH(旧SCP)→ 現SFTPrsync 独自(SSH越し)
標準搭載✅(OpenSSH 付属)✅(多くのLinux)
学習コスト
2026年推奨度△(1回コピー限定)

一言で言うと

  • scp: 一回きりの単純なファイルコピー(数MB〜数百MB程度)
  • rsync: それ以外すべて(大きいファイル、繰り返し、バックアップ、ディレクトリ同期)

迷ったら rsync

現代の Linux 環境では**rsync を第一選択にすべき**。scp と同じことができ、+α で多機能です。

黄金コマンド

# rsync の万能パターン
rsync -avz --progress /source/ user@server:/dest/
  • -a: アーカイブモード(権限・タイムスタンプ・シンボリックリンク保持)
  • -v: 詳細表示
  • -z: 圧縮転送
  • --progress: 進捗表示

詳細は以下で解説します。


まず押さえる:scp と rsync の本質

scp(Secure Copy)

scp は SSH プロトコル上でファイルをコピーするコマンド。1990年代から存在するUnix系OSの標準ツール。

scp = ssh + cp

シンプルで直感的、SSH さえ動けば使える手軽さが最大の魅力。

rsync(Remote Sync)

rsync は Andrew Tridgell(Samba 開発者)が開発した差分転送特化の同期ツール。1996年公開。

rsync = 差分検出 + 転送最適化 + 柔軟なオプション

delta-transfer algorithm(差分転送アルゴリズム)により、変更部分のみを転送します。

【重要】OpenSSH 9.0 以降の scp

2022年4月リリースの OpenSSH 9.0 で、scp の基盤プロトコル(SCP プロトコル)が非推奨化されました:

  • 旧 SCP プロトコル: 設計上のセキュリティ問題あり
  • 新 scp コマンド: 内部的にSFTPを使用(デフォルト)
  • 従来の挙動が必要: -O オプションで旧SCP プロトコル指定
# OpenSSH 9.0+ での scp
scp file.txt user@server:/path/
# 実際は SFTP プロトコルで転送

# 旧SCP プロトコル強制(互換性のため)
scp -O file.txt user@server:/path/

現状では scp コマンド自体は動作しますが、新規スクリプトでは rsync や sftp を推奨する流れになっています。


scp の使い方

基本構文

# ローカル → リモート
scp [オプション] source user@host:/dest

# リモート → ローカル
scp [オプション] user@host:/source /dest

# リモート → リモート
scp [オプション] user1@host1:/source user2@host2:/dest

基本例

# ファイルを送る
scp file.txt user@server:/home/user/

# ファイルを取得
scp user@server:/home/user/file.txt ./

# ディレクトリ全体
scp -r ./mydir user@server:/backup/

主要オプション

オプション説明
-r再帰的(ディレクトリ)
-P PORTSSHポート指定(大文字P
-i KEY秘密鍵指定
-p権限・タイムスタンプ保持
-C圧縮
-l LIMIT帯域制限(Kbit/s)
-v詳細表示
-qquiet モード
-O旧SCPプロトコル使用

例:ポート指定と秘密鍵

scp -P 2222 -i ~/.ssh/id_rsa file.txt user@server:/path/

⚠️ scp の -P大文字。SSHの -p と紛らわしいので注意。

帯域制限

# 800 Kbit/s に制限
scp -l 800 large_file.tar.gz user@server:/backup/

圧縮

scp -C file.txt user@server:/path/

CPU使用率上がるが、遅い回線では有効。

scp の限界

  • 中断した転送を再開できない(最初からやり直し)
  • 除外パターンなし
  • 削除同期なし
  • 差分検出なし(毎回全ファイル送信)
  • dry-run なし

これらが必要なら rsync へ。


rsync の使い方

基本構文

rsync [オプション] source destination

基本例

# ローカル間コピー
rsync -av /source/ /backup/

# ローカル → リモート
rsync -avz /source/ user@server:/backup/

# リモート → ローカル
rsync -avz user@server:/source/ /local/backup/

# 差分バックアップ
rsync -avz --delete /source/ user@server:/mirror/

末尾スラッシュの重要な違い

これは rsync 最大の落とし穴。

# ❌ ディレクトリごとコピー(source ディレクトリ自体をコピー)
rsync -av /source /dest
# → /dest/source/ が作られる

# ✅ 中身をコピー
rsync -av /source/ /dest/
# → /dest/ 内に source の中身

source の末尾に / があるかどうかで挙動が変わる。dest は影響なし。

主要オプション

オプション説明
-aアーカイブモード(-rlptgoD の組み合わせ)
-r再帰的
-lシンボリックリンクをリンクのまま
-p権限保持
-tタイムスタンプ保持
-gグループ保持
-oオーナー保持
-Dデバイスファイル保持
-v詳細表示
-z圧縮
--progress進捗表示
-P--partial --progress の短縮
--dry-run / -n実行せず表示のみ
--exclude除外パターン
--include含むパターン
--delete存在しないファイルを削除
--partial中断ファイルを保持
--append途中から追記
--checksum / -cチェックサム比較
--bwlimit帯域制限(KB/s)
-e "ssh -p PORT"SSH オプション

-a オプションの詳細

rsync 最重要オプション。「アーカイブモード」で、以下の組み合わせ:

-a = -rlptgoD

-r: 再帰的
-l: シンボリックリンク保持
-p: 権限保持
-t: タイムスタンプ保持
-g: グループ保持
-o: オーナー保持
-D: デバイスファイル保持

通常の用途では -a で十分。よく rsync -av のように -v を足す。

-a の落とし穴

# シンボリックリンクの実体をコピーしたい
rsync -aL /source/ /dest/
# -L でリンクを追跡

デフォルトはリンクとしてコピー。詳細はLinuxでシンボリックリンクを作成・確認・削除する方法の記事も参照。


--dry-run:安全な事前確認

rsync -avn --delete /source/ /dest/
# --dry-run(-n)で実際の転送はせず、何が起こるか表示

⚠️ –delete を使う時は必ず –dry-run で確認。誤って重要なファイルを消す事故を防ぐ。

# ステップ1: 確認
rsync -avn --delete /source/ /dest/ | less

# ステップ2: 意図通りなら実行
rsync -av --delete /source/ /dest/

--exclude / --include:除外パターン

基本

# 特定ファイル除外
rsync -av --exclude 'file.log' /source/ /dest/

# パターン
rsync -av --exclude '*.log' --exclude '*.tmp' /source/ /dest/

# ディレクトリ
rsync -av --exclude '.git/' --exclude 'node_modules/' /source/ /dest/

複数除外パターン

# 除外リストをファイルに
cat > exclude.txt <<EOF
.git/
node_modules/
*.log
tmp/
.DS_Store
EOF

rsync -av --exclude-from=exclude.txt /source/ /dest/

–include の使い方

# .txt だけコピー
rsync -av --include='*.txt' --exclude='*' /source/ /dest/

# ディレクトリも含める必要あり
rsync -av \
  --include='*/' \
  --include='*.txt' \
  --exclude='*' \
  /source/ /dest/

--include--exclude順序が重要。先に書いたものが優先。


--delete:削除同期

送信元にないファイルを、送信先から削除:

rsync -av --delete /source/ /dest/

用途:

  • ミラーリング: 完全な複製を作る
  • バックアップの同期
  • デプロイ: 古いファイルの残置防止

⚠️ 危険なオプション。誤ると重要データを消す。必ず --dry-run で確認。

亜種

オプションタイミング
--delete転送前に削除
--delete-before明示的に前
--delete-after転送後に削除
--delete-during転送中に削除(デフォルト)
--delete-excluded除外パターンのファイルも削除

--partial / --append:中断からの再開

–partial

rsync -avz --partial /source/ user@server:/dest/

途中で失敗した場合、中途半端に転送されたファイルを保持。次回実行で続きから。

–progress との組み合わせ

rsync -avz --partial --progress /source/ user@server:/dest/
# または短縮
rsync -avzP /source/ user@server:/dest/

-P = --partial --progress。実務での標準パターン。

–append

rsync -av --append large.iso user@server:/backup/

既存の破損ファイルに追記。用途は限定的(ダウンロード再開等)。

–append-verify

rsync -av --append-verify large.iso user@server:/backup/

追記後にチェックサム検証。


SSH との連携

基本:SSH ポート指定

# デフォルトポート(22)
rsync -avz /source/ user@server:/dest/

# カスタムポート
rsync -avz -e "ssh -p 2222" /source/ user@server:/dest/

秘密鍵指定

rsync -avz -e "ssh -i ~/.ssh/deploy_key" /source/ user@server:/dest/

SSH 設定ファイルの活用

# ~/.ssh/config
Host myserver
  HostName server.example.com
  Port 2222
  User deploy
  IdentityFile ~/.ssh/deploy_key

これで:

rsync -avz /source/ myserver:/dest/
# 短くて明快

詳細はSSH host key verification failed の記事も参照。

SSH Multiplexing(高速化)

# ~/.ssh/config
Host *
  ControlMaster auto
  ControlPath ~/.ssh/sockets/%r@%h-%p
  ControlPersist 600

複数回の rsync を連続実行する時、SSH ハンドシェイクを1回で済ませて高速化。

mkdir -p ~/.ssh/sockets

rsync daemon モード(SSHなし)

rsync は SSH なしでも動作:

# サーバー側で rsyncd を起動
sudo systemctl start rsync

# クライアントから
rsync -av rsync://server/module/ /local/

用途:

  • LAN内の高速転送(暗号化不要)
  • 公開ミラーサーバー
  • 巨大データセット配布

圧縮:-z オプション

rsync -avz /source/ user@server:/dest/

転送データを gzip 相当で圧縮。

いつ有効?

状況-z の効果
遅いWAN回線✅ 有効(帯域節約)
LAN 1Gbps以上❌ 逆効果(CPU がボトルネック)
既に圧縮されたファイル(zip/jpg/mp4)❌ ほぼ効果なし
テキスト・ソースコード✅ 大きく効果あり

圧縮レベル

# レベル指定(1-9)
rsync -av --compress-level=9 /source/ /dest/

新オプション:–compress-choice

# 圧縮方式選択(rsync 3.2+)
rsync -av --compress-choice=zstd /source/ /dest/

zstd は gzip より高速で圧縮率も高い。対応版なら推奨。


進捗と情報表示

–progress

rsync -avz --progress /source/ /dest/

ファイル単位の進捗を表示:

100,000,000  75%  10.00MB/s    0:00:02

–info オプション(rsync 3.1+)

# 進捗を全体で表示(1行)
rsync -av --info=progress2 /source/ /dest/

出力例:

    100,000,000  50%    5.00MB/s    0:00:10

より見やすい。

–stats

rsync -av --stats /source/ /dest/

転送完了後にサマリー表示:

Number of files: 100
Number of created files: 20
Number of deleted files: 0
Total file size: 1.00G bytes
Total transferred file size: 100M bytes

帯域制限

–bwlimit

# 1MB/s に制限
rsync -avz --bwlimit=1000 /source/ user@server:/dest/

# 500 KB/s
rsync -avz --bwlimit=500 /source/ user@server:/dest/

単位は KB/s(scp の -l は Kbit/s なので注意)。

用途

  • 本番サーバーへの影響を最小化
  • ISP帯域の逼迫防止
  • 定時業務時間の考慮

実践シナリオ

シナリオ1:本番サーバーへのデプロイ

# ローカルの build ディレクトリを本番へ
rsync -avz --delete \
  --exclude='.git/' \
  --exclude='node_modules/' \
  --exclude='*.log' \
  ./dist/ \
  deploy@production:/var/www/myapp/

# dry-run で確認
rsync -avzn --delete ...   # -n を追加

シナリオ2:定期バックアップ

#!/bin/bash
# /opt/scripts/backup.sh

SOURCE="/home/user/important/"
DEST="backup@backup-server:/backups/user/$(date +%Y%m%d)/"

rsync -avz --partial \
  --exclude-from=/etc/rsync-exclude.txt \
  --log-file=/var/log/backup.log \
  "$SOURCE" "$DEST"

crontab に登録:

0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

詳細はcrontab 書き方 例の記事も参照。

シナリオ3:ディレクトリ完全ミラー

# ミラー元と完全一致(削除も同期)
rsync -avz --delete \
  --delete-excluded \
  /source/ user@mirror:/dest/

シナリオ4:世代バックアップ(–link-dest)

# 前回のバックアップからハードリンクで容量節約
rsync -av --delete \
  --link-dest=/backup/yesterday \
  /source/ /backup/today/

変更のないファイルはハードリンクで共有し、ディスク容量を節約。

詳細はLinuxでシンボリックリンクを作成・確認・削除する方法の記事も参照(ハードリンクの解説)。

シナリオ5:大きい ISO ファイルの再開可能な転送

rsync -avzP large.iso user@server:/backup/
# 中断されても続きから

シナリオ6:特定ファイルタイプだけ

# 画像ファイルだけコピー
rsync -avz \
  --include='*/' \
  --include='*.jpg' \
  --include='*.png' \
  --exclude='*' \
  /photos/ user@server:/images/

シナリオ7:Git リポジトリの高速転送(.git 除外)

rsync -avz \
  --exclude='.git/' \
  --exclude='node_modules/' \
  --exclude='vendor/' \
  --exclude='tmp/' \
  --exclude='log/' \
  /path/to/repo/ user@server:/deploy/

デプロイスクリプトの典型例。

シナリオ8:ローカルバックアップ(別ドライブ)

rsync -av --delete \
  --exclude='.Trash/' \
  --exclude='*.tmp' \
  /home/user/ /mnt/backup/user/

外付けHDD への同期。


パフォーマンスチューニング

1. SSH Multiplexing

# ~/.ssh/config
Host *
  ControlMaster auto
  ControlPath ~/.ssh/sockets/%r@%h-%p
  ControlPersist 600

2. 圧縮は状況次第

# 遅い回線: -z 有効
rsync -avz ...

# 速いLAN: -z なしの方が速い
rsync -av ...

3. CPU が速い暗号を選ぶ

rsync -avz -e "ssh -c aes128-gcm@openssh.com" /source/ user@server:/dest/
# chacha20-poly1305 も高速

4. HPN-SSH 導入(超巨大転送)

WAN 越しに数百 GB 以上を転送するなら、SSH の高性能版 HPN-SSH を検討。

5. 並列 rsync(複数ディレクトリ)

# 4並列
find /source -mindepth 1 -maxdepth 1 -type d -print0 | \
  xargs -0 -P 4 -I {} rsync -avz {} user@server:/dest/

6. –whole-file オプション

# ローカル間、または高速LAN
rsync -av --whole-file /source/ /dest/

差分計算をスキップして全ファイル送信。LAN内では差分計算のオーバーヘッド > 転送コストの場合に有効。


トラブルシューティング

Permission denied

Permission denied (publickey).
rsync: connection unexpectedly closed

→ SSH認証の問題。SSH host key verification failed の記事を参照。

rsync: command not found

bash: rsync: command not found

→ インストール:

sudo apt install rsync           # Ubuntu/Debian
sudo dnf install rsync           # RHEL/CentOS
brew install rsync               # macOS

リモート側にも rsync が必要

rsync は両側にインストールが必要。片方だけだと失敗:

rsync: connection unexpectedly closed
rsync: server sent unexpected response

→ リモート側にも:

ssh user@server "sudo apt install rsync"

Argument list too long

rsync: too many arguments

→ ファイル数が多すぎる。パターンや除外を活用:

rsync -av --include='*.log' --exclude='*' /source/ /dest/

または find + xargs で分割。

詳細はLinux find オプション一覧の記事も参照。

タイムスタンプがずれる

rsync -av /source/ /dest/
# 常に差分ありと判定される

→ ファイルシステム間で秒精度が違う:

rsync -av --modify-window=1 /source/ /dest/
# 1秒の誤差を許容

FAT32 は2秒精度。

中断されて中途半端なファイル残る

rsync -av --partial /source/ /dest/
# 次回実行で続き

.partial のような一時ファイルとして残る。

rsync: chown failed

rsync: chown failed on "file": Operation not permitted

→ 送信先が非root、-a に含まれる -o -g で失敗:

rsync -rlptv /source/ /dest/
# または
rsync -a --no-o --no-g /source/ /dest/
# または
sudo rsync -av /source/ /dest/

ディレクトリの末尾スラッシュを忘れた

# ❌
rsync -av /source /dest
# → /dest/source/ ができる

# ✅
rsync -av /source/ /dest/

–delete で重要ファイルを消した

必ず –dry-run で事前確認

事故った場合はバックアップから復旧。復元不能なファイルはrsync --delete前に別途保存を。


セキュリティ考慮

1. SSH経由が基本

# ✅ SSH経由(暗号化)
rsync -avz /source/ user@server:/dest/

# ❌ rsync daemon(非暗号化)
rsync -av /source/ rsync://server/module/
# LAN 内限定推奨

2. 鍵の管理

# 専用の deploy 鍵
ssh-keygen -t ed25519 -f ~/.ssh/deploy_ed25519 -C "deploy@myapp"

# サーバー側 authorized_keys
# command="rsync --server ..." を付けて制限も可能

3. rsync 用の制限された SSH コマンド

# authorized_keys
command="rsync --server -logDtprze.iLsfxCIvu . /var/backup",no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3...

rsync だけを許可する鍵。デプロイ自動化で活用。

4. root で走らせる時の注意

# ❌ 危険
sudo rsync -av / user@server:/backup/

# ✅ 明示的な範囲
sudo rsync -av /etc /home user@server:/backup/

よくある質問(FAQ)

Q1. scp は本当に非推奨?

プロトコル(旧SCP)は非推奨、コマンド(scpコマンド)はOpenSSH 9.0以降SFTP プロトコルで動作。新規スクリプトでは rsync / sftp が推奨されています。

Q2. rsync と scp の速度差

  • 単一ファイル・初回: 誤差程度
  • 繰り返し転送: rsync が圧倒的(差分のみ)
  • 多数の小ファイル: rsync がやや遅い(メタデータ処理)
  • 単一巨大ファイルの部分更新: rsync が超高速

Q3. rsync でリモート → リモート

# 直接はできない、経由が必要
rsync -avz user1@host1:/source/ /tmp/local/
rsync -avz /tmp/local/ user2@host2:/dest/

または -e ssh オプションでのTrick が可能だが、通常は経由推奨。

Q4. rsync の逆方向コピー

# サーバー → ローカル
rsync -avz user@server:/source/ /local/dest/

方向は source/dest の順序で決まる。

Q5. Windows で rsync 使いたい

  • WSL2: Linux 環境で普通に rsync
  • cwRsync: Cygwin ベース
  • DeltaCopy: GUI ラッパー
  • Git Bash: 一部制限あり

Q6. rsync のログ

rsync -av --log-file=/var/log/rsync.log /source/ /dest/

または --log-file-format でフォーマット指定。

Q7. 転送前にサイズを知りたい

du -sh /source/
# サイズ確認

rsync -avn --stats /source/ /dest/ | tail
# 実際にどれくらい転送されるか(差分後)

Q8. rsync の逆マウント

Sshfs でリモートをマウントしてローカルとして扱う:

sshfs user@server:/remote /mnt/remote
rsync -av /source/ /mnt/remote/

用途は限定的。

Q9. rsync が遅い

# 圧縮を切る(LAN)
rsync -av ...

# 大きいファイルは差分計算スキップ
rsync -av --whole-file ...

# 並列
find /source -mindepth 1 -maxdepth 1 -type d | \
  xargs -P 4 -I {} rsync -av {} /dest/

Q10. Docker との連携

# ローカル → Dockerコンテナ
docker cp /source/ container:/dest/

# rsync で Docker 経由(volume マウント推奨)
rsync -av /source/ /var/lib/docker/volumes/myapp_data/_data/

詳細はdocker daemon 接続エラーの記事も参照。

Q11. rsync のバージョン確認

rsync --version
# rsync  version 3.2.7  protocol version 31

3.1+ で --info 系オプション、3.2+ で --compress-choice=zstd 等の新機能。

Q12. rsync 完了後にコマンド実行

rsync -av /source/ user@server:/dest/ && \
  ssh user@server "systemctl restart myapp"

デプロイ後のサービス再起動等に。


参考リンク・関連資料

公式

関連ツール

  • rclone – クラウドストレージ対応
  • Globus – 高速大容量転送
  • Unison – 双方向同期

関連記事(本サイト)


まとめ

scp vs rsync、要点を再整理します。

使い分け早見表

状況推奨
1回きりの単純コピーscp(or rsync)どちらでも
繰り返しコピーrsync(差分転送)
大きいファイルの中断再開rsync --partial
ディレクトリの完全同期rsync --delete
バックアップrsync(世代管理も --link-dest
デプロイrsync(除外パターン活用)
除外パターン必要rsync --exclude
dry-run 確認したいrsync --dry-run
帯域制限両方可(rsyncは KB/s、scp は Kbit/s)
クラウドストレージ(S3等)rclone 検討

黄金コマンド

# rsync の実務標準
rsync -avz --progress /source/ user@server:/dest/

# バックアップ(削除同期)
rsync -avz --delete --dry-run /source/ user@server:/backup/
# 確認後、-n を外して実行

# デプロイ
rsync -avz --delete \
  --exclude='.git/' --exclude='node_modules/' \
  ./dist/ deploy@prod:/var/www/myapp/

rsync 必須オプション

オプション用途
-aアーカイブモード(標準)
-v詳細表示
-z圧縮(遅い回線)
-P--partial --progress
--dry-run / -n事前確認
--exclude除外
--delete削除同期
-e "ssh -p PORT"SSHオプション

事故防止

  • –delete は必ず –dry-run
  • source の末尾スラッシュに注意
  • -a で権限保持を意識
  • SSH経由が基本(rsync daemon はLAN内限定)
  • 本番デプロイ前にステージングで検証

2026年の推奨

  • scp: 単純な1回コピーのみ(あるいはOpenSSH 9.0+で内部SFTP)
  • rsync: すべての本格的なファイル転送で第一選択
  • rclone: S3・Google Drive等のクラウド連携
  • SFTP: インタラクティブなファイル操作

これらの知識は、Linux サーバー運用・バックアップ・デプロイ・データ移行など、あらゆる場面で活用できます。本記事をブックマークしておけば、ファイル転送のタスクを安全かつ効率的にこなせるようになります。


本記事は2026年6月時点の情報をもとに、rsync 3.2+、OpenSSH 9.x、Ubuntu 22.04/24.04、macOS Sonoma での動作確認・公式ドキュメントに基づき作成しています。rsync/OpenSSH のバージョンによって挙動が異なる場合があるため、最新の情報はrsync公式OpenSSH公式 もあわせてご確認ください。