#author("2020-01-27T05:28:38+00:00","default:wikiwriter","wikiwriter")
#author("2021-05-12T06:29:23+00:00","default:src128","src128")
&tag(rsync);
*目次 [#e4a94a93]
#contents
*関連ページ [#y47cf913]
*参考情報 [#kc801135]
-[[Command Technica:はじめてrsyncを使う方が知っておきたい6つのルール (1/2) - ITmedia エンタープライズ:http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html]]
-[[地雷だらけのrsyncを理解する。 - こせきの技術日記:http://koseki.hatenablog.com/entry/20090424/rsync]]

*概要 [#m7e876a5]
-UNIXの定番ファイル同期/転送コマンド。

*基本的な使い方 [#l8e27d2e]

**考え方の基本 [#v0be55ef]
-SRC/*をDESTディレクトリにコピーする場合以下のコマンドを使用する。
 rsync -avz SRC/ DEST
-SRCディレクトリの末尾のスラッシュの有無が重要。DESTの末尾は関係ない。
--末尾スラッシュつきのSRC/の場合SRC/*と考えると分かりやすい。DESTの内部にディレクトリが作られない。
--末尾スラッシュなしの場合、DESTの内部にフォルダが作られる。
--ただしリモートがシンボリックリンクで実態をコピーしたい場合"SRC/"でやらないとシンボリックリンクが作成されてしまう。
-安全のためには空のDESTディレクトリを作成してテストするのが良い。こせきの技術日記によるとSRCの末尾に常にスラッシュを追加するのが推奨されてる。
-基本オプションは"-av"。"-z"を追加すると圧縮される。
-"--delete"でDESTに存在しないファイルが削除される。
-"--exclude='vendor/bunlde'"のような指定でフォルダを無視できる。複数のパターンを指定したい場合"--exclude='log/*' --exclude='tmp/*'のように指定できる

**コピー元からコピー先へ同期 [#me27ed0a]
-基本オプション"-av"を使う
 rsync -av ~/dir1/ /media/disk/backup/

※コピー先ディレクトリがなければ作られる。

**コピー元からコピー先へ同期(削除もする) [#me27ed0a]
-基本オプション"-av"と"--delete"を同時指定
 rsync -av --delete ~/dir1/ /media/disk/backup/


**実用基本形 [#df1fca04]
-以上を踏まえリモートフォルダをローカルにバックアップコピーする場合の基本形。wwwフォルダはbackupの中に作られない(copy from_dir/* to_dirの*省略と考えるとわかりやすい)。zは圧縮オプション。
 rsync -az --delete -e ssh demohost:/home/www/ /home/backup
-コピー元に末尾スラッシュをつけて、コピー先にからディレクトリを指定するほうが安全。
*Tips [#g8abac7f]

**コピー元のスラッシュの取り扱い [#b29d89e4]
-例えば以下のような構造のフォルダがある場合を考える。
#pre{{
.
├── a
│   └── a.txt
├── b
│   └── b.txt
└── c
}}
-aフォルダをスラッシュ付きで、bフォルダをスラッシュなしでコピー
 rsync -av a/ c
 rsync -av b c
-すると次のようになる。転送元フォルダの最後にスラッシュがあるとそのフォルダ自体はコピー先に作られない。
#pre{{
.
├── a
│   └── a.txt
├── b
│   └── b.txt
└── c
    ├── a.txt
    └── b
        └── b.txt
}}

**シェルスクリプトの変数にオプションを入れて使いたい [#r8811606]
-そのまま変数に「opt="--exclude='log'"」のように入れてオプション変数として利用しても、シングルクォートがエスケープされてしまいうまく動かない(set -xしてみるとよくわかる)
-次のように、配列として渡すといいらしい。[[bash - rsync option in a variable - Stack Overflow:http://stackoverflow.com/questions/3697901/rsync-option-in-a-variable]]
#pre{{
roption=(
    -a
    --recursive
    --progress
    --exclude='class'
    --delete
    --exclude='exclude'
    --exclude='.svn'
    --exclude='.metadata'
    --exclude='*.class'
)

rsync "${roption[@]}" /media/CORSAIR/workspace ~/
}}

**サーバー負荷を軽減したい [#p04e04c2]
-[[rsyncの負荷を抑える方法 - 理想未来ってなんやねん:http://pcmaster.hatenablog.com/entry/20111217/p2]]


*トラブルシューティング [#c5cb3771]

**rsync error: error in rsync protocol data stream (code 12) [#xc724675]
-いかにもsshのポートなどプロトコル関係のように思えるが実際は転送先のパスが存在しないだけだった。
-コピー元、コピー先のパスを確認すること。


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS