Rsyncでローカルとリモートのディレクトリを同期する方法

はじめに

「remote sync(リモート同期)」を表すRsyncは、リモートとローカルでファイルを同期するツールです。変更されたファイルのみを移動して、コピーするデータ量を最小限に抑えるアルゴリズムを採用しています。

このガイドでは、この強力なユティリティの基本的な使い方について取り上げます。

Rsyncとは?

Rsyncは、とても柔軟性に富んだネットワーク対応の同期ツールです。LinuxとUnixのようなシステムにおいて多く普及しており、システムスクリプトのツールとしての人気も高いため、ほとんどのLinuxディストリビューションにデフォルトとして含まれます。

基本的な構文

rsyncの基本的な構文は非常に単純で、操作方法はssh、scp、cpと似ています。

次のコマンドでテストディレクトリを2つとテストファイルをいくつか作成します。

  • cd ~
  • mkdir dir1
  • mkdir dir2
  • touch dir1/file{1..100}

ここに、dir1というディレクトリと、その中に100個の空ファイルがあります。

  • ls dir1
Outputfile1    file18  file27  file36  file45  file54  file63  file72  file81  file90 file10   file19  file28  file37  file46  file55  file64  file73  file82  file91 file100  file2   file29  file38  file47  file56  file65  file74  file83  file92 file11   file20  file3   file39  file48  file57  file66  file75  file84  file93 file12   file21  file30  file4   file49  file58  file67  file76  file85  file94 file13   file22  file31  file40  file5   file59  file68  file77  file86  file95 file14   file23  file32  file41  file50  file6   file69  file78  file87  file96 file15   file24  file33  file42  file51  file60  file7   file79  file88  file97 file16   file25  file34  file43  file52  file61  file70  file8   file89  file98 file17   file26  file35  file44  file53  file62  file71  file80  file9   file99 

また、dir2という空のディレクトリもあります。

同じシステムでdir1の内容をdir2に同期するには、次のように入力します。

  • rsync -r dir1/ dir2

-rオプションはrecursive(再帰)を表し、ディレクトリ同期に必要です。

代わりに-aフラグを使用することもできます。

  • rsync -a dir1/ dir2

-aオプションは、コンビネーションフラグです。「archive」を表すこのオプションは、再帰的に同期し、シンボリックリンク、スペシャルファイル、デバイスファイル、変更時刻、グループ、所有者、パーミッションを保持します。-rよりも一般的で、通常はこちらを使用するのがよいでしょう。

重要

お気付きのように、上記のコマンドの1つ目の引数の後に、トレイリングスラッシュ(/)が付いています。

  • rsync -a dir1/ dir2

これは、「dir1の内容」を表すのに必要なものです。トレイリングスラッシュがないと、dir1がディレクトリごとdir2内に配置されます。これによって以下のような階層が生成されます。

  • ~/dir2/dir1/[files]

rsyncコマンドを実行する前に、必ず引数を再確認してください。Rsyncでは、-nまたは--dry-runオプションでこうしたチェックができます。-vフラグ(verbose[詳細]の略)も適切な出力の入手に必要です。

  • rsync -anv dir1/ dir2
Outputsending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . . 

この出力を、トレイリングスラッシュを削除した場合の出力と比較します。

  • rsync -anv dir1 dir2
Outputsending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . . 

ディレクトリごと転送されるのがわかります。

Rsyncでリモートシステムと同期する方法

リモートシステムとの同期は、リモートマシンにSSHアクセス可能で、双方のマシンにrsyncがインストールされているなら簡単です。2台のマシン間でSSHアクセスが検証されたら、この構文を使用して、前述のdir1フォルダをリモートコンピュータに同期できます(今回はディレクトリごと転送したいので、トレイリングスラッシュを省いていることにご注意ください)。

これは、ローカルシステムからリモートシステムにディレクトリをプッシュするため、「push」操作といいます。逆の操作は、「pull」 といいます。「pull」はリモートディレクトリをローカルシステムに同期します。dir1がローカルシステムではなくリモートシステムにある場合、構文は次のようになります。

cpや類似ツールと同様、転送元は1つ目の引数、転送先は2つ目の引数と決まっています。

Rsyncの便利なオプション

Rsyncには、ユーティリティのデフォルトの動作を変更するオプションが多数用意されています。重要度の高いフラグについてはすでに触れました。

テキストファイルのように未圧縮のファイルを転送している場合、-zオプションを付けて圧縮すると、ネットワーク転送負荷を軽減できます。

  • rsync -az source destination

-Pフラグは大変便利です。これはフラグ--progress--partialを組み合わせたものです。1つ目は転送の進捗バーを表示するフラグで、2つ目は中断した転送の再開を可能するフラグです。

  • rsync -azP source destination
Outputsending incremental file list ./ file1            0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101) file10            0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101) file100            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101) file11            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101) . . . 

コマンドを再度実行すると、変更がないため出力に時間がかかりません。これは、rsyncが変更時刻を利用して、変更有無を判断できることをよく表しています。

  • rsync -azP source destination
Outputsending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00 

一部のファイルで変更時刻を更新すると、rsyncが差分のみを巧みに再コピーするのが確認できます。

  • touch dir1/file{1..10}
  • rsync -azP source destination
Outputsending incremental file list file1             0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101) file10             0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101) file2             0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101) file3             0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101) . . . 

2つのディレクトリを真に同期させるには、転送元から削除されたファイルを、転送先ディレクトリでも削除する必要があります。デフォルトでは、rsyncは転送先ディレクトリからファイルを削除しません。

--deleteオプションでこの動作を変更できます。このオプションを使用する前に、-dry-runオプションを使用して、データ損失を防ぐテストを実施してください。

  • rsync -a --delete source destination

同期するディレクトリ内で、特定のファイルやディレクトリを除外するには、--exclude=オプションに続けてカンマで区切った一覧形式でそれらを指定します。

  • rsync -a --exclude=pattern_to_exclude source destination

除外を指定したパターンがある場合、それが別のパターンに一致したら、--include=オプションを使用してその除外をオーバーライドできます。

  • rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

最後に、rsyncの--backupオプションは、重要なファイルのバックアップ保存に使用します。バックアップファイルの保存先ディレクトリを指定する--backup-dirオプションと組み合わせて使用します。

  • rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

まとめ

Rsyncは、ネットワーク接続でのファイル転送を容易にし、ローカルディレクトリの同期を安定させます。柔軟性に富むrsyncを使用すれば、様々なファイルレベルの操作も可能になります。

さらに、rsyncに習熟すると複雑なバックアップ操作の設計や、何をどう転送するかについて、きめ細やかな制御ができるようになります。