Linux – rsync の使い方について詳しく解説

概要

rsync は、Unix 系オペレーティングシステムで使用されるファイル転送および同期ツールです。 この記事では、rsync の基本的な使い方を詳しく解説します。

インストール

rsync がインストールされていない場合は次のコマンドでインストールできます。

sudo apt-get install rsync
Bash

cp、scp との違い

ファイルをコピーするコマンドとしては、他に cpscp がよく使用されます。 違いとして、rsync は増分だけコピーするようになっているため、ディレクトリのバックアップを取りたい場合などに効率的です。

基本構文

rsync の基本的なコマンド構文は次の通りです。

rsync [OPTION] SRC DEST
Bash

ディレクトリの末尾の / の有無による挙動の差異

  • スラッシュなし: rsync -avh /src /dest

    • /src ディレクトリ自体を /dest ディレクトリにコピーします。結果として、/dest/src が作成されます。
  • スラッシュあり: rsync -avh /src/ /dest

    • /src ディレクトリ内の内容を /dest ディレクトリにコピーします。結果として、/dest 内に /src の内容が直接配置されます。

ローカルディレクトリ間の同期

rsync -avh /source/directory/ /destination/directory/
Bash

このコマンドは、同期元の /source/directory/ の内容を同期先の /destination/directory/ にコピーします。

  • -a オプションはアーカイブモードで、ファイルのパーミッション、所有権、タイムスタンプを保持します。
  • -v は詳細モードで、進行状況を表示します。
  • -h は人間が読みやすい形式で出力を表示します。

ローカルからリモートサーバーへのファイル転送

rsync -avhz /local/directory/ user@remote_host:/remote/directory/
Bash

このコマンドは、同期元のローカルの指定ディレクトリの内容を同期先のリモートサーバーの指定ディレクトリに転送します。 -z オプションを指定すると、転送するファイルを圧縮するので、ネットワークの帯域を節約できます。

リモートサーバーからローカルへファイル転送

rsync -avhz user@remote_host:/remote/directory/ /local/directory/
Bash

このコマンドは、同期元のリモートサーバーの指定ディレクトリの内容を同期先のローカルの指定ディレクトリに転送します。

–delete オプション

--delete オプションを使用すると、同期元に存在しないファイルが同期先のディレクトリから削除されます。

rsync -avh --delete /source/directory/ /destination/directory/
Bash

–exclude オプション

--exclude オプションを使用すると、特定のファイルやディレクトリを同期から除外できます。

rsync -avh --exclude 'node_modules' /source/directory/ /destination/directory/
Bash

このコマンドは、node_modules ディレクトリを除外して同期を行います。

–progress オプション

--progress オプションを使用すると、各ファイルの転送進行状況を表示します。

rsync -avh --progress /source/directory/ /destination/directory/
Bash

-n オプション

-n オプションを使用すると、実際の同期は実施せず、ファイルの差分を確認することができます。 コピーを実際に実行する前の確認に使用します。

rsync -avhn /source/directory/ /destination/directory/
Bash

変更をログに記録する

--log-file オプション

--log-file オプションで処理をログファイルに出力できます。

rsync -avh --log-file=rsync.log /source/directory/ /destination/directory/
Bash

また、ログの書式を --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
Plain text
書式 説明
%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
Bash

次の行を追加します。

0 2 * * * rsync -avh /source/directory/ /destination/directory/
Bash

主なオプション

挙動

オプション 説明
-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 転送中の進行状況を表示

コメント

コメントする