リモートホストとの間でファイルのコピー(アップロード/ダウンロード)をするコマンド。リモートホストとは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
-p
-t
が必要。cp
コマンドでは-p
でタイムスタンプも保存してくれるが。--progress
-r
-t
-u
-v
-z
rsync -R abc/def/ghi.dat remote:/home/who/
この場合、リモートには/home/who/ghi.dat
ではなく/home/who/abc/def/ghi.dat
という名前でアップロードされる。リモートにディレクトリが存在しない場合は自動で作成される。
cp
での同じ役割をはたすのは--parents
。
リモートからダウンロードする場合
$ rsync -e "ssh -p <port>" <ID>@<IP>:<remote_path> <local_path>
リモートにアップロードする場合
$ rsync -e "ssh -p <port>" <local_path> <ID>@<IP>:<remote_path>
転送の進捗をリアルタイムに表示させるには、--progress
オプションを使う。プログレスバーのようなビジュアルでの表示ではなく、単に数値で表示するのはちょっと残念。
rsync
で標準出力させる方法が見つからなかったが、ssh
で以下のようにすればよい。
ssh remote "cat abc.txt" | less
時間がかかってもよいからネットワークの負荷をかけずにゆっくりダウンロードまたはアップロードするには--bwlimit
オプションを使う。このオプションで指定する数字の単位はKBps(キロバイト毎秒であってキロビット毎秒ではない)。
例
# 毎秒100KBに制限してダウンロードrsync --bwlimit=100 remote:foo.txt ./