Linuxなどを利用する上で、「これはどうやったら実現できるのだろう」と思うことは数知れない。本連載では、ユーザーがひんぱんに遭遇するであろう問題と、その解決方法を解説する。上級者には新たな発見を、初心者には上級者への道の手引きとなるだろう。
この記事は会員限定です。会員登録すると全てご覧いただけます。
ファイルやディレクトリをバックアップ/同期するためのツールは幾つも存在していますが、rsyncはとりわけ大きな人気を誇っているといってよいでしょう。変更分を検出して差分のみを転送することで、ネットワーク経由でも効率的にバックアップ/同期が行える点や、sshなどのリモートシェル経由での利用が可能な点など、機能の洗練度はさすがに登場から10年以上たっているだけのことはあります。バックアップやミラーリングなどの用途であれば、基本的にはコピー元とコピー先でわずかな違いしか発生しないはずで、ファイルの相違部分だけを転送するrsyncは効率的に機能します。
そんなrsyncですが、ファイル転送アルゴリズムなどに改良が加えられたバージョン3.0.2が先月リリースされました。今回は、はじめてrsyncに触れる方のために押さえておきたい基本事項を紹介します。
rsyncに限らず、コマンドラインで動作するユーティリティは、知らない方にとってまるで呪文(じゅもん)ような存在です。しかし、基本的な構文を押さえてしまえばさほど難しいものではありません。rsyncであれば、次のようにrsyncというコマンドの後、コピー元、コピー先の順で指定するのが基本形で、後は必要に応じてオプションを付加していくことになります。
rsync [オプション] コピー元 コピー先
多くのコマンドラインユーティリティを難しくみせているのは、主にオプションの存在でしょう。例に漏れず、rsyncにも非常に多くのオプションが用意されており、それらを使えばrsyncはさらに強力なツールと化します。しかし、最初からすべてのオプションを覚える必要はありません。実際には、幾つかのオプションを覚えておけば、ほとんどの場合でことは足ります。以下の表は、最低限覚えておくとよいオプションです。基本的にオプションは「-avn」のように続けて指定できますが、--deleteや--existingのように、いわゆるロングオプションの場合は続けて記述することはできません。
オプション(かっこ内はロングオプション) | 機能 |
---|---|
-a | 「-rlptgoD」と指定したのと同様の効果。元のパーミッションやグループなどを保持したまま同期できるので、基本的に付加しておくのがよい。アーカイブモードとも呼ばれる |
-v | 処理中の経過ファイル名を表示する |
-e [シェル名] | リモートシェルを指定する。デフォルトでsshが利用されるため、rshなどを使う特別な必要がなければ最近では用いない |
-n(--dry-run) | 実行時の動作だけを表示。テストに使用するとよい |
-r | 指定したディレクトリ下の各ディレクトリも再帰的にバックアップする |
-u | 追加されたファイルだけをコピーする |
-z | データを圧縮する |
--existing | 更新されたファイルだけをコピーし、追加されたファイルは無視する |
--delete | コピー元で削除されたファイルは、コピー先でも削除する。-aオプションと同時に指定することでコピー元とコピー先を同期できることになる |
--exclude=PATTERN | パターン一致するファイルを除外する(--exclude 'パターン'と書いてもよい) |
--exclude-from=FILE | ファイルに記述されたパターンと一致するファイルを除外する |
--include=PATTERN | パターン一致するファイルを除外しない |
--include-from=FILE | ファイルに記述されたパターンと一致するファイルを除外しない |
--stats | rsyncアルゴリズムの転送効率を表示する |
-h(--help) | ヘルプを表示する |
特に覚えておくべきオプションの1つが「-a」で表現されるアーカイブオプションです。このオプションは、「-rlptgoD」と指定した場合と同じ効果を発揮します。一般的には、デフォルトでこのオプションを指定しておくとよいでしょう。ただし、ハードリンクを維持するための「-H」オプションのように、「-a」ではカバーできないが、より高度なバックアップを行う上で有用なオプションは幾つか存在します。今回はこれらのオプションは紹介しませんが、ほぼすべてのニーズを満たすだけのオプションが用意されていることは覚えておくとよいでしょう。
では、実際に幾つかのケースを例にとってrsyncを試してみましょう。まず、ローカルマシンのホームディレクトリ以下にあるディレクトリ(ここでは~/dir1/)以下を、外付けのHDD(ここでは/media/disk/)に作成したbackupディレクトリにバックアップしてみます。この場合、コマンドは次のようになります(オプションとして-avを付加しています)。
$ rsync -av ~/dir1/ /media/disk/backup/
ついミスを犯しやすい点として、コピー元のディレクトリ名を「dir1」と指定するか、「dir1/」とスラッシュ(/)を追加するかで挙動が変わる点が挙げられます。例えば、以下のように指定すると、前者はdir1ディレクトリの中身と、そのディレクトリ自体がコピーされますが、後者はdir1ディレクトリの中身はコピーされますが、ディレクトリはコピーされません。
$ rsync -av ~/dir1 /media/disk/backup/
$ rsync -av ~/dir1/ /media/disk/backup/
まとめると、
ということになります。なお、こうした末尾のスラッシュが与える影響を考えなければならないのは、コピー元の指定のみで、コピー先の指定では考慮する必要はありません。
Copyright © ITmedia, Inc. All Rights Reserved.