Linux rsyncコマンド: オプションと使用例

サーバー2台のフォルダーを揃えるために毎回全体をコピーし直すと、変わったファイルが1つでも転送量はフォルダー全体のままです。 rsyncコマンドはremote syncの略で、元と先を比べて変わったファイルだけを送り、ローカルのフォルダー間でもSSHでつないだサーバー間でも同じように動作します。この記事では、基本的な使い方とオプション、SSHとrsyncデーモンという2つの接続方式の例をまとめました。
この記事の出力はAlmaLinux 9.8のrsync 3.2.7で取得したものです。インストールされていなければ、パッケージマネージャーで入れます。
# RHEL系
dnf -y install rsync
# Debian系
apt -y install rsync✅ 基本的な使い方
基本的な使い方は次のとおりです。
rsync -オプション コピー元 コピー先cpコマンドと同じく、元を先に、先を後に書きます。元の末尾にスラッシュ[/]を付けるとフォルダーの中身だけが先に入り、付けなければフォルダーごと入ります。
~]# rsync -av www/ backup/
sending incremental file list
index.html
img/
img/logo.png
~]# rsync -av www backup/
sending incremental file list
www/
www/index.html
www/img/
www/img/logo.png同じコマンドをもう一度実行するとファイル一覧は空になり、sentのバイト数も数百バイトに減ります。サイズと更新時刻が同じファイルはスキップされるためです。
~]# rsync -av www/ backup/
sending incremental file list
sent 166 bytes received 13 bytes 358.00 bytes/sec
total size is 3,015 speedup is 16.84-aなしで-rだけを使うと更新時刻が保存されず、次の実行で同じファイルをまた送ることになります。フォルダーを同期するときは-aを基本として付けます。
-nオプションは転送せずに変わるファイルだけを表示し、結果の末尾に[(DRY RUN)]が付きます。--deleteのように先のファイルを消すオプションは、-nで先に確認してから実行します。
~]# rsync -avn --delete www/ backup/
sending incremental file list
deleting old.bak
index.html
sent 188 bytes received 39 bytes 454.00 bytes/sec
total size is 3,013 speedup is 13.27 (DRY RUN)✅ rsyncコマンドのオプション & シミュレーター
| オプション | 説明 | |
|---|---|---|
| -a | --archiveサブディレクトリまでコピーし、権限・所有者・更新時刻・シンボリックリンクを保持 (-rlptgoDと同じ) | |
| -v | --verbose転送したファイル名と転送量を表示 | |
| -z | --compress転送中にファイルデータを圧縮 | |
| -r | --recursiveサブディレクトリまでコピー (-aに含まれる) | |
| -t | --times更新時刻を保持 (-aに含まれる)。次の実行でスキップするファイルを決める基準 | |
| -n | --dry-run転送せずに変わるファイルだけを表示し、末尾に(DRY RUN)を付ける | |
| -u | --update先のほうが新しいファイルはスキップ | |
| -h | --human-readableバイト数をK・M・G単位で表示 | |
| -P | --partial --progressと同じ。ファイルごとに進捗を表示し、中断した転送を再開 | |
| -i | --itemize-changesファイルごとに変わった項目を記号で表示>f+++++++++ 新規ファイル · >f.st...... サイズ・時刻の変更 · *deleting 削除 | |
| -e | --rsh=COMMANDリモートシェルを指定-e 'ssh -p 2222 -i /root/.ssh/key.pem' | |
| --delete | 元にないファイルを先から削除 (-rまたは-aが必要) | |
| --exclude=PATTERN | パターンに一致するファイル・ディレクトリを除外--exclude '*.tmp' --exclude 'cache/' | |
| --include=PATTERN | --excludeより前に置き、そのパターンだけを除外から外す | |
| --max-size=SIZE | 指定サイズより大きいファイルは転送しない (--min-sizeは小さいファイル)--max-size=3M --min-size=10k | |
| --bwlimit=RATE | 転送速度を制限、単位はKiB/s | |
| --stats | ファイル数・転送量の統計を表示 |
✅ 接続方式: SSHとrsyncデーモン
リモートサーバーと同期する接続方式は2つです。ホストの後ろのコロン1つ[:]はSSHを経由し、コロン2つ[::]は873番ポートのrsyncデーモンに直接つなぎます。
| 区分 | SSH方式 (:) | rsyncデーモン方式 (::) |
|---|---|---|
| 接続形式 | rsync -オプション user@host:/パス /ローカルパス | rsync -オプション host::モジュール/パス /ローカルパス |
| ポート | SSHポート (既定は22) | 873 |
| 暗号化 | SSHで暗号化 | 暗号化なし |
| 認証 | SSH鍵またはパスワード | rsyncd.confのhosts allow、任意でアカウント・パスワード |
| サーバー側の設定 | なし (SSHで接続できればそのまま使える) | rsync-daemonのインストール、/etc/rsyncd.conf、873番ポートの開放 |
| 用途 | サーバー間のバックアップ・配備 (基本の選択) | SSHアカウントを渡さない内部ネットワークのミラーリング |
🔲 SSH方式
SSHで接続できるサーバーなら、サーバー側の設定なしにそのまま使えます。ポートが違う場合や鍵ファイルを使う場合は、-eオプションにsshコマンドをそのまま入れます。
# ローカル → リモート
rsync -avz /home/2server_data/ root@192.168.45.239:/home/1server_data/
# リモート → ローカル
rsync -avz root@192.168.45.239:/home/1server_data/html_Remote /home/2server_data
# SSHポート・鍵ファイルを指定
rsync -avz -e 'ssh -p 2222 -i /root/.ssh/key.pem' root@192.168.45.239:/home/1server_data/ /home/2server_data
特定のファイルやディレクトリを外すには、--excludeをパターンごとに1つずつ付けるか、波かっこでまとめて一度に書きます。
rsync -avz --exclude 'html_Remote_Excertion' --exclude 'Exception_File' root@192.168.45.239:/home/1server_data/ /home/2server_data
rsync -avz --exclude={'html_Remote_excertion/*','Exception_File'} root@192.168.45.239:/home/1server_data/ /home/2server_data
🔲 rsyncデーモン方式
rsyncデーモンはSSHアカウントなしに873番ポートでモジュール単位のアクセスを許可します。通信は暗号化されないため、同じ内部ネットワークのサーバー間で使います。
AlmaLinux 9ではrsync-daemonパッケージをインストールしてサービスを起動します。firewalldを使うサーバーなら873番ポートを開け、クラウドサーバーならコンソールのファイアウォールで開けます。RHEL 8以前で使っていたxinetd方式は9ではなくなりました。
dnf -y install rsync-daemon
systemctl enable --now rsyncd
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload設定ファイル[/etc/rsyncd.conf]にモジュール名とパス、許可するホストを書きます。read onlyをyesにすると、リモートからは受け取るだけになります。
[myhome]
path = /home
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.45.182
max connections = 3
timeout = 30リモート側でホストの後ろにコロン2つだけを書くとモジュール一覧が、モジュール名まで書くとその中のファイル一覧が表示されます。
~]# rsync 192.168.45.239::
myhome
home
~]# rsync 192.168.45.239::myhome
drwxr-xr-x 4,096 2025/06/12 22:14:39 .
drwxr-xr-x 4,096 2025/06/12 22:21:10 1server_data
drwxr-xr-x 4,096 2025/06/12 22:14:39 2server_dataコピーは[ホスト::モジュール/パス]の形式で受け取ります。--deleteは元にないファイルを先から消し、--includeは--excludeより前に置いた項目だけを除外から外します。
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
./
Exception_File
html_Remote/
html_Remote_Excertion/
sent 58 bytes received 332 bytes 780.00 bytes/sec
total size is 442 speedup is 1.13
~]# rsync -avz --delete 192.168.45.239::myhome/1server_data/ /home/2server_data/
~]# rsync -avz --include '*.html' --exclude 'exclude.txt' 192.168.45.239::myhome/1server_data/ /home/2server_data/

SELinuxが有効なサーバーでは、モジュールパスへのアクセスが[Permission denied (13)]で止まることがあります。テストでは[setenforce 0]でSELinuxを切ったあとに通りました。
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
rsync: change_dir "/1server_data" (in myhome) failed: Permission denied (13)
sent 8 bytes received 90 bytes 65.33 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1658) [Receiver=3.1.2]--bwlimitで転送速度をKiB/s単位で制限し、-Pを付けるとファイルごとの進捗も一緒に見られます。--max-sizeと--min-sizeは指定したサイズ範囲のファイルだけを転送します。
rsync -avzP --bwlimit=100 192.168.45.239::myhome/1server_data/ /home/2server_data/
rsync -avz --max-size='3M' --min-size='10k' 192.168.45.239::myhome/1server_data/ /home/2server_data/
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。