rsync コマンド

リモートホストとの間でファイルのコピー(アップロード/ダウンロード)をするコマンド。リモートホストとはSSHで通信できることが前提。

基本的な使い方

## リモートホストからローカルにダウンロードする
$ rsync «リモートユーザ名»@«リモートホスト名»:/«絶対パス» «ローカルパス»

## リモートホストからローカルにダウンロードする
## リモートでのパスはリモートのホームディレクトリからの相対パスでもよい
$ rsync «リモートユーザ名»@«リモートホスト名»:«相対パス» «ローカルパス»

## ポート番号が22以外の場合
$ rsync -e "ssh -p «ポート番号»" «リモートユーザ名»@«リモートホスト名»:/«絶対パス» «ローカルパス»

## 秘密鍵のファイルを指定する場合
$ rsync -e "ssh -i «秘密鍵ファイル名»" «リモートユーザ名»@«リモートホスト名»:/«絶対パス» «ローカルパス»

リモートからローカルへのダウンロード、またはローカルからリモートへのアップロードが可能だが、リモートから別のリモートへの転送はできない。

ディレクトリの指定方法

コピー元としてディレクトリを指定する場合、最後に / を付けるかどうかで動作が異なってくる。

ローカルに foo/bar/hello.txt というファイルがあった場合、

rsync -r foo/bar remote:dst

と書くと、foo/barディレクトリ自体がコピーされる、というイメージになるので、 remoteホストには dst/bar というディレクトリが作られ、 dst/bar/hello.txt というパスにファイルがコピーされる。

rsync -r foo/bar/ remote:dst

と書くと、foo/barディレクトリの中身がコピーされる、というイメージになり、 remoteホストには dst/hello.txt というパスにファイルがコピーされる。

オプション

-a
-rlptgoD と同じ
--bwlimit
ネットワーク帯域を制限して転送する。-> ゆっくり転送するには
--copy-links
シンボリックリンクはリンク先の中身を転送
-g
グループもコピー
-l, --links
シンボリックリンクをシンボリックリンクとして転送
-o
ファイルオーナーもコピー (root権限でのみ可)
-p
パーミッションも保存。タイムスタンプも保存するには -t が必要。 cpコマンドでは -p でタイムスタンプも保存してくれるが。
--progress
コピーの進捗を表示
-r
ディレクトリの場合はその中を再帰的にコピー
-t
タイムスタンプも保存
-u
タイムスタンプが新しいファイルのみをコピー
-v
コピーするファイル名を、進捗に合わせて表示
-z
ネットワーク上を転送する前後に圧縮と解凍の処理を入れて、ネットワークを節約する。たぶん代わりにCPU使用率があがる。

HOWTO

ローカルにあるファイルをディレクトリ名も含めてリモートにアップロードするには

rsync -R abc/def/ghi.dat remote:/home/who/

この場合、リモートには /home/who/ghi.dat ではなく /home/who/abc/def/ghi.dat という名前でアップロードされる。リモートにディレクトリが存在しない場合は自動で作成される。

cp での同じ役割をはたすのは --parents

ポートが22以外のSSHサーバにrsyncで接続するには

リモートからダウンロードする場合

$ rsync -e "ssh -p <port>" <ID>@<IP>:<remote_path> <local_path>

リモートにアップロードする場合

$ rsync -e "ssh -p <port>" <local_path> <ID>@<IP>:<remote_path>

-> ポートが22以外のSSHサーバに接続するには

進捗を表示するには

転送の進捗をリアルタイムに表示させるには、--progress オプションを使う。プログレスバーのようなビジュアルでの表示ではなく、単に数値で表示するのはちょっと残念。

リモートのファイルをローカルに保存するのではなく、標準出力させて別のコマンドにパイプでつなぐには

rsync で標準出力させる方法が見つからなかったが、ssh で以下のようにすればよい。

ssh remote "cat abc.txt" | less

ネットワークの帯域を絞ってゆっくり転送するには

時間がかかってもよいからネットワークの負荷をかけずにゆっくりダウンロードまたはアップロードするには --bwlimitオプションを使う。このオプションで指定する数字の単位はKBps(キロバイト毎秒であってキロビット毎秒ではない)。

# 毎秒100KBに制限してダウンロード
rsync --bwlimit=100 remote:foo.txt ./
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク