前置き
SSH でファイルを転送するには昔から scp コマンドを使ってゐたけれども、今はもう scp コマンドの使用は推奨されてゐないので、代はりに rsync を使ひたい。が、rsync コマンドはオプションがいっぱいあってこんがらがるのでここにメモっておくことにする。
オプション
ファイル属性を維持しない場合
取り敢へず -lr
を付けとけば cp -R
によるファイルコピーとだいたい同じ感じで転送される。
-
-l
--links
- シンボリックリンクを維持する
-
-r
--recursive
- ディレクトリーを再帰的にコピーする
必要に応じて以下も足す。
-
--devices
- キャラクターデバイスファイルやブロックデバイスファイルを維持する (要転送先 root 権限)
-
--specials
- ソケットや FIFO を維持する
ファイル属性を維持する場合
-a
を付けるだけで cp -pR
によるファイルコピーとだいたい同じ感じで転送される。
-
-a
--archive
-
-lr --devices --specials
に加へて以下のオプション四種類をまとめて全部乗せする
-
-
-p
--perms
- パーミッションを維持する
-
-t
--times
- ファイルの更新日時を維持する
-
-o
--owner
- ファイルの所有ユーザーを維持する
-
-g
--group
- ファイルの所有グループを維持する
(ACL とかまで気にするならマニュアルを読んで必要なオプションを調べよ)
気が向いたら付けるオプション
-
-H
--hard-links
- ハードリンクを維持する
-
-h
--human-readable
- 数字を分かりやすくする (12,345 → 12.05K)
-
-P
=--partial --progress
- 途中で中断しても転送先にそのままファイルを残す + 進捗を表示する
- 巨大ファイル転送時に便利
-
-s
--protect-args
- ファイルパス名に含まれる空白などの特殊文字を維持する
-
-v
--verbose
- ファイル名とかファイルサイズとかを表示する
-
-z
--compress
- 圧縮により転送を高速化する
オペランド
転送元
転送元のファイルパス名は、末尾に /
が付いてゐるとそのディレクトリーの中身を一つづつ転送先ディレクトリーの中に置くといふ意味になる。つまり下の三つはだいたい同じ意味。
rsync -r from/foo to
rsync -r from/foo/ to/foo
rsync -r from/foo/* to/foo
転送先
転送先のファイルパス名は、以下の全ての条件を満たすときを除いて、転送したファイルを中に置くためのディレクトリー名とみなされる (と思ふ。ちゃんと調べてゐない)。逆に以下の全ての条件を満たすときは、転送先ファイルパスに直接ファイルが置かれる。
- 転送先ファイルパス名の末尾に
/
がない - 転送先ファイルパス名がディレクトリーではない (つまりファイルが存在しないか、ディレクトリー以外のファイルである)
- 転送元ファイルが一つだけで、ディレクトリーではない
……これいちいち覚える気にならんし、転送先にディレクトリーが存在するかどうかで結果が変はるなんてめんどいので、「転送先ファイルパス名は常にディレクトリー名を指定し、末尾に /
を付ける」ルールで統一しよう。なほ、rsync には --no-target-directory
的なオプションはない模様。