UNIX/Linuxの部屋 rsyncコマンドの使い方


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド rsync ファイル・ディレクトリのバックアップ・ミラーリング・同期

rsync コマンドは、ファイル・ディレクトリのバックアップやミラーリング・同期処理を行うコマンドである。リモートサーバへの同期も可能である。また、差分のあるファイルのみを高速にミラーリングすることができる。

ミラーリングやバックアップを行うだけなら cp コマンドでも実現可能だが、rsync コマンドには以下のようなメリットがある。
  • ミラーリングが可能 (単純な cp だと、削除されたファイルがコピー先に残ってしまう)
  • リモートマシンへ/リモートマシンからのバックアップが可能
  • 2回目以降の実行では、前回実行時との差分を調べ、必要なファイルのみ転送するため高速である

基本
もっとも基本的な使い方は、
% rsync -av /foo/from_dir /bar/to_dir
である。これはローカルマシン内の /foo/from_dir 以下を /bar/to_dir/ にコピーを行うもので、物理的な別ディスクにバックアップしたり、USB メモリなどに保存したりする場合に有用だろう。もし /bar/to_dir が存在していなくても、自動的に作成される。

なお、上記の結果、
/bar/to_dir/from_dir/...
というファイルが作成される。そうではなく from_dir 直下のファイルが to_dir 直下に作成してほしい場合は以下のように転送元ディレクトリの末尾にスラッシュを付ける (from_dir ではなく from_dir/ とする、ということ)。
% rsync -av /foo/from_dir/ /bar/to_dir

オプション -av の意味を説明する。-a を指定することで、rsync はアーカイブモードで動作するようになる。アーカイブモードとは頻繁に使用されるオプション群に名前を付けたもので、実際は -a は -rlptgoD と同じである。各オプションの意味は以下のとおり。
  • ディレクトリを再帰的にコピーする (-r)
  • シンボリックリンクを、そのままシンボリックリンクとしてコピーする (-l)
  • パーミッションをそのままコピーする (-p)
  • タイムスタンプをそのままコピーする (-t)
  • グループをそのままコピーする (-g)
  • ファイルオーナー (所有者) をそのままコピーする (-o)
  • デバイスファイルやを特殊ファイルを、そのままコピーする (-D)
-v は、コピーしたファイル名や、コピーしたバイト数などの転送情報を表示するオプションなので、慣れないうちは -v を指定した方が理解が早いだろう。

実行例
rsync を実行すると、以下のようにファイルコピーするファイル・ディレクトリを表示し、最後に転送量や転送速度などを表示する。
% rsync -av /foo/from_dir /bar/to_dir
building file list ... done

created directory to_dir
./
file.txt
program.c
(略)
sent 125706799 bytes received 117812 bytes 14802895.41 bytes/sec
total size is 125368532 speedup is 1.00

一度目の転送が完了したら、もう一度同じコマンドを実行してみよう。
% rsync -av /foo/from_dir /bar/to_dir
building file list ... done

sent 80627 bytes received 20 bytes 53764.67 bytes/sec
total size is 125368532 speedup is 1554.53
今度はあまり時間がかからずに終了したはずだ。rsync が from_dir と to_dir の差異をチェックし、転送すべきファイルは存在しないと判断したため、ファイルのコピーが行われなかったからである。

もし何かしらエラーが発生した場合は、最後のレポート部分に、さらに以下のようなエラー情報が表示される。
rsync error: some files could not be transferred (code 23) at main.c(977) [sender=2.6.9]

リモートへのコピー
rcp や scp などと同様に、転送先のディレクトリ指定にホスト名やユーザ名を付加すればよい。
% rsync -av /foo/from_dir/ example.com:to_dir/
→ example.com の to_dir/ に転送する。ユーザ名は、ローカルのユーザ名と同じものを使用する
% rsync -av /foo/from_dir/ user@example.com:to_dir/
→ example.com の to_dir/ にユーザ名 user で転送する。
% rsync -av -e ssh /foo/from_dir/ user@example.com:to_dir/
→ rsh でなく、ssh でログインする

上記の例はいずれも転送先がリモートホストの場合だったが、転送元がリモートホストでも問題ない。
% rsync -av -e ssh user@example.com:from_dir/ /foo/to_dir/
→ リモートからローカルへ転送する

オプションは以下のとおり。
表示系オプション
-v または --verbose … コピーしたファイル名や、コピーしたバイト数などの転送情報を表示する。
-v オプションは複数個指定でき、-v より -vv の方が、さらに -vv より -vvv の方がより詳細な情報を表示する。
-q または --quiet … 転送情報を表示しない。
--stats : 転送後に、より詳細なファイル数・転送サイズを表示する。
Number of files: 5528
Number of files transferred: 15
Total file size: 125368532 bytes
Total transferred file size: 174602 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 80611
File list generation time: 0.325 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 81077
Total bytes received: 800
-h または --human-readable … バイト数などを読みやすい形で表示する。
通常の -v オプションでは、以下のような形のメッセージになる。
sent 125531503 bytes received 117812 bytes 7179960.86 bytes/sec
total size is 125368532 speedup is 1.00
これに -h オプションを付けると、キロバイト・メガバイト単位で表示するので少しだけ読みやすくなる。
sent 125.53M bytes received 117.81K bytes 4.12M bytes/sec
total size is 125.37M speedup is 1.00

情報保存系オプション
-a または --archive … アーカイブモード。-rlptgoD を指定したのと同じ (-H が含まれていないことに注意)
-H または --hard-links … ハードリンクをそのまま反映する。
-p または --perms … パーミッションをそのままコピーする。
-E または --executability …
--flags … ファイルフラグをそのままコピーする。
-l または --links … シンボリックリンクを、そのままシンボリックリンクとしてコピーする。
-t または --times … タイムスタンプをそのままコピーする。
--devices … ブロックデバイスをコピーする (root のみ有効)
--specials … 名前付きパイプや FIFO などの特殊ファイルをコピーする
-D … "--devices --specials" と同じ
-o または --owner … ファイル所有者をそのままコピーする (root で実行した場合のみ有効)
-g または --group … グループをそのままコピーする

-z または --compress … データ転送時に圧縮を行う
--compress-level=NUM … 圧縮レベルを指定する

各種オプション
-c または --checksum
転送要否を決定する際、タイムスタンプとファイルサイズではなく、128bit の MD4 チェックサムを用いて同一ファイルか否かをチェックする。
-r または --recursive
ディレクトリを再帰的にコピーする。
-R または --relative
送信元のディレクトリ部分を、相対パスとして転送先に送信する。
% rsync -av /foo/bar/baz.c remote:/tmp/
→ 転送先には /tmp/baz.c として保存される。
% rsync -avR /foo/bar/baz.c remote:/tmp/
→ 転送先には /tmp/foo/bar/baz.c として保存される。
-u または --update
転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない
-S または --sparse
穴あきファイルを効率よく転送する
-n または --dry-run
コピーや転送を実際には行わず、行われる転送内容の出力のみ行う
--list-only
コピーや転送は行わず、転送対象となるファイルの表示のみ行う
-W または --whole-file
rsync アルゴリズムを使用せず、ファイル全体を転送する
--existing または --ignore-non-existing
転送先に存在しないファイルは転送対象外とする (新規ファイルの作成を行わない)
--ignore-existing
転送先に存在しているファイルは、転送対象外とする (新規ファイルの作成のみ行う)
--remove-source-files
転送に成功したファイルは転送元から削除する (ただしディレクトリは残す)
--delete
delete extraneous files from destination dirs
--max-size=SIZE
転送対象とするファイルサイズ上限を指定する
--min-size=SIZE
転送対象とするファイルサイズ下限を指定する。SIZE の例を以下に示す。
--max-size=2K (=2*1024)
--max-size=2M (=2*1024*1024)
--max-size=2G (=2*1024*1024*1024)
-f, --filter=RULE
add a file-filtering RULE
--exclude=PATTERN
指定したパターンにマッチするファイルを転送対象外とする。
例: --exclude="*.txt"
→ 拡張子 txt のファイルは転送対象外とする
--bwlimit=KBPS
帯域制御を行い、指定の速度以下で転送を行う (KBPS は KByte/秒 で指定)


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説