Posted at

rsyncコマンドの使い方

Linuxコマンドのrsyncについて、結構はまりどころが多いので使い方をまとめます。

rsyncコマンドは、ローカル・リモート問わずファイルのコピーとして利用できるコマンドです。差分ファイルのみを転送するため高速かつ柔軟なオプションで痒いところに手が届きます。ただ、癖が結構あるので、要点は抑えないと期待した通りに動いてくれないため、簡単に解説します。


基本形

rsync -av src/ dest/

srcはコピー元、destはコピー先のパスになります。


destは省略可能ですが、その場合は、カレントディレクトリがコピー元、srcがコピー先となります。


情報の表示 -v

転送対象になったファイル、転送量等を表示してくれます。


基本的につけます。


ドライランモード -n

ファイルのコピーを実際に行わず、コピー対象となるファイルのみ確認したい場合があると思います。-nオプションを付けることで、動作確認が可能です。


アーカイブモード -a

下記のオプションがまとめて有効にしてくれます。

オプション
意味

-r
ディレクトリを再帰的に処理

-l
シンボリックリンクをそのままコピー

-p
パーミッションの保持

-t
タイムスタンプを保持

-g
所有グループを保持

-o
所有者をそのまま保持

-D
デバイスファイルや特殊ファイルを保持


ユーザーとパーミッションに注意する

sudo権限で実行した場合は問題ないですが、各ユーザーで実行した場合はパーミッションに気をつける必要があります。


-aオプションには、グループやタイムスタンプ等を書き換える処理が含まれているため、場合によっては、書き換え時にエラーが表示されます。注意したいのは、データ自体はコピーされ、その後グループやタイムスタンプ書き換え時にエラーが表示される点です。ドライランで前もって気づけないため、事前に確認が必要です。

必要に応じて、有効となるオプションを外しましょう。

参考

rsyncでエラーが出たけどコピーはできてる


コピー元の指定方法に注意

rsync -av src/ dest/

コピー元に指定するパスの最後の/の有無で動作が変わってきます。


/を指定した場合は、指定されたディレクトリパス配下の内容でコピー先にコピーを行います。


/を付けない場合は、コピー先に指定されたパスに指定されたディレクトリごとコピーを行います。

(例)

rsync -av ./dir/ dest/

#結果
dest/hoge.txt

rsync -av ./dir dest/

#結果
dest/dir/hoge.txt

大抵のケースでは、コピー元の最後に/を付ける事になると思います。


特定のファイルのみコピー対象とする、またはコピー対象から除外する

--include、--excludeを利用することでコピー対象を柔軟に指定可能です。

但し、指定方法に癖があるため、ドライランモードで確認しながらの作業をお勧めします。

zipファイルのみをコピーしたい場合で説明します。

(失敗例)

# src以下の全てがコピー対象になってしまう。

rsync -anv --include="*.zip" src/ dest/

上の例は一見行けそうですが期待した結果は得られません。

--includeは、指定されたパターンのファイルをコピー対象にしますが、除外までしません。

要は、結局全てのファイルが対象になります。そのため、--excludeとセットで使います。

(失敗例2)

# src直下のzipのみコピー対象になってしまう。

rsync -anv --include="*.zip" --exclude="*" src/ dest/

上の例では、ディレクトリに含まれるzipまでコピーしてくれません。再帰処理の指定は-aオプションに入っていますが何が原因でしょうか。

rsyncの--include、--excludeオプションでは、上の階層から指定した順番にマッチしていきます。ディレクトリがマッチ対象になっていないため、マッチ対象になるように--includeを追加する必要があります。

(失敗例3)

# いらないディレクトリまでコピーされてしまう...

rsync -anv --include="*/" --include="*.zip" --exclude="*" src/ dest/

上のコマンドで一応zipファイルのみをコピーするという目的は達成できます。が、いらないディレクトリまで全てコピーされます。


-m オプションを付けて空のディレクトリはコピー対象から外しましょう。

# zipファイルのみをコピーする

rsync -amnv --include="*/" --include="*.zip" --exclude="*" src/ dest/


存在しないコピー先を指定した場合

コピー先がまだ存在しない場合もあると思います。

1階層分はディレクトリを作ってくれますが、2階層以上はエラーとなります。


コピー元にないファイルを消す --delete

抽出対象以外のファイル・ディレクトリをコピー先から消します。

空ではないディレクトリを消そうとする場合は、エラーとなります。消したい場合は--force をつけます。