概要
rsync は、Unix 系オペレーティングシステムで使用されるファイル転送および同期ツールです。
この記事では、rsync の基本的な使い方を詳しく解説します。
インストール
rsync がインストールされていない場合は次のコマンドでインストールできます。
sudo apt-get install rsync
cp、scp との違い
ファイルをコピーするコマンドとしては、他に cp や scp がよく使用されます。
違いとして、rsync は増分だけコピーするようになっているため、ディレクトリのバックアップを取りたい場合などに効率的です。
基本構文
rsync の基本的なコマンド構文は次の通りです。
rsync [OPTION] SRC DEST
ディレクトリの末尾の / の有無による挙動の差異
スラッシュなし:
rsync -avh /src /dest/srcディレクトリ自体を/destディレクトリにコピーします。結果として、/dest/srcが作成されます。
スラッシュあり:
rsync -avh /src/ /dest/srcディレクトリ内の内容を/destディレクトリにコピーします。結果として、/dest内に/srcの内容が直接配置されます。
ローカルディレクトリ間の同期
rsync -avh /source/directory/ /destination/directory/
このコマンドは、同期元の /source/directory/ の内容を同期先の /destination/directory/ にコピーします。
-aオプションはアーカイブモードで、ファイルのパーミッション、所有権、タイムスタンプを保持します。-vは詳細モードで、進行状況を表示します。-hは人間が読みやすい形式で出力を表示します。
ローカルからリモートサーバーへのファイル転送
rsync -avhz /local/directory/ user@remote_host:/remote/directory/
このコマンドは、同期元のローカルの指定ディレクトリの内容を同期先のリモートサーバーの指定ディレクトリに転送します。
-z オプションを指定すると、転送するファイルを圧縮するので、ネットワークの帯域を節約できます。
リモートサーバーからローカルへファイル転送
rsync -avhz user@remote_host:/remote/directory/ /local/directory/
このコマンドは、同期元のリモートサーバーの指定ディレクトリの内容を同期先のローカルの指定ディレクトリに転送します。
–delete オプション
--delete オプションを使用すると、同期元に存在しないファイルが同期先のディレクトリから削除されます。
rsync -avh --delete /source/directory/ /destination/directory/
–exclude オプション
--exclude オプションを使用すると、特定のファイルやディレクトリを同期から除外できます。
rsync -avh --exclude 'node_modules' /source/directory/ /destination/directory/
このコマンドは、node_modules ディレクトリを除外して同期を行います。
–progress オプション
--progress オプションを使用すると、各ファイルの転送進行状況を表示します。
rsync -avh --progress /source/directory/ /destination/directory/
-n オプション
-n オプションを使用すると、実際の同期は実施せず、ファイルの差分を確認することができます。
コピーを実際に実行する前の確認に使用します。
rsync -avhn /source/directory/ /destination/directory/
変更をログに記録する
--log-file オプション
--log-file オプションで処理をログファイルに出力できます。
rsync -avh --log-file=rsync.log /source/directory/ /destination/directory/
また、ログの書式を --log-file-format で指定できます。デフォルトは
--log-file-format="%i %n%L" となっており、以下のような形式で出力されます。
2025/02/10 21:07:56 [1049853] cd+++++++++ atcoder/abs/PracticeA/
2025/02/10 21:07:56 [1049853] >f+++++++++ atcoder/abs/PracticeA/in_1.txt
2025/02/10 21:07:56 [1049853] >f+++++++++ atcoder/abs/PracticeA/in_2.txt
| 書式 | 説明 |
|---|---|
%i |
更新項目 |
%f |
ファイル名 |
%n |
ファイル名 (短い形式) |
%U |
ファイルの uid |
%G |
ファイルの gid または DEFAULT |
%M |
ファイルの変更日時 |
%B |
ファイルのパーミッション (例: rwxrwxrwt) |
%L |
シンボリックリンク: -> リンク先、ハードリンク: => リンク先 |
%o |
操作 (send, recv, del) |
%l |
ファイルサイズ |
%b |
実際に転送されたファイルサイズ |
%t |
現在の日時 |
%p |
rsync セッションのプロセス ID |
%a |
リモート IP アドレス |
%h |
リモートホスト名 |
%c |
コピー元のファイルの各ブロックのチェックサムの合計 |
%m |
モジュール名 |
%P |
モジュールパス |
%u |
認証されたユーザー名または空の文字列 |
rsync による定期的な同期
cron ジョブを使用して rsync を定期的に実行することができます。次の例は、毎日午前 2 時に rsync を実行する cron ジョブを設定する方法です。
crontab -e
次の行を追加します。
0 2 * * * rsync -avh /source/directory/ /destination/directory/
主なオプション
挙動
| オプション | 説明 |
|---|---|
-n, --dry-run |
実際の変更は反映せずに試行 |
-z, --compress |
転送中にファイルデータを圧縮 |
-a, --archive |
アーカイブモード (-rlptgoD と同等、-HAX は無効) |
-d, --dirs |
ディレクトリを再帰せずに転送 |
-r, --recursive |
ディレクトリを再帰的に処理 |
--delete |
同期元にないファイルを同期先から削除する |
--exclude=PATTERN |
PATTERN に一致するファイルを同期対象から除外 |
--exclude-from=FILE |
FILE から同期対象から除外するパターンを読み取る |
-e, --rsh=COMMAND |
使用するリモートシェルを指定 |
--log-file=FILE |
指定した FILE に操作ログを記録 |
--log-file-format=FMT |
指定した FMT を使用してログを記録 |
--checksum-choice=STR |
チェックサムアルゴリズムを選択 |
同期する属性
| オプション | 説明 |
|---|---|
-l, --links |
シンボリックリンクをリンクとしてコピー |
-o, --owner |
所有者を保持 (管理者権限が必要) |
-g, --group |
所有グループを保持 |
-p, --perms |
パーミッションを保持 |
-t, --times |
ファイルの変更日時を保持 |
-D |
(--devices --specials と同等) |
--devices |
デバイスファイルを保持 (管理者権限が必要) |
--specials |
特殊ファイルを保持 |
コマンドの出力
| オプション | 説明 |
|---|---|
-v, --verbose |
詳細モード |
-h, --human-readable |
人間が読みやすい形式で数値を表示 |
--progress |
転送中の進行状況を表示 |

コメント