tohokuaikiのチラシの裏

技術的ネタとか。

rsyncでシンボリックリンクをコピーするときのオプションまとめ

rsyncシンボリックリンクをリンクとしてコピーするか、その先までたどってコピーするかの違い。
辿って欲しいときと欲しくない時がある。

デフォルトの挙動

デフォルトが何かというのはあるのだけど、よくつかうアーカイブモード(aオプション)はシンボリックリンクシンボリックリンクのままコピーする。ファイルをたどらない。

3つのオプション

man rsyncすると

-L, --copy-links transform symlink into referent file/dir
--copy-unsafe-links only "unsafe" symlinks are transformed
--safe-links ignore symlinks that point outside the tree

と3つ出る。


日本語にすると

--copy-links シンボリックリンクのファイル・ディレクトリを辿ってコピーする
--copy-unsafe-links "unsafe"なシンボリックリンクだけコピーする
--safe-links Tree外のシンボリックリンクは辿らない

こんな感じかな?

とりあえずやってみる

こんな構成のディレクトリをコピーする。treeコマンドによる一覧はこれ。

$ tree .
.
|-- bar
|-- foo
|   `-- baz -> /tmp
|-- hoge
|   `-- uki
|       |-- a
|       |-- b
|       |-- c
|       `-- d
`-- wat -> hoge/uki

./foo/bazが操作するより上の階層/tmpにリンクしてて、./watは操作内の階層./hoge/ukiにリンクしてる

5 directories, 5 files
アーカイブモードのデフォルト

$ rsync -e ssh -avzn ./* httpmanual@10.200.51.1:~/work/20120629/
building file list ... done
bar
wat -> hoge/uki
foo/
foo/baz -> /tmp
hoge/
hoge/uki/
hoge/uki/a
hoge/uki/b
hoge/uki/c
hoge/uki/d

sent 287 bytes received 80 bytes 734.00 bytes/sec
total size is 12 speedup is 0.03

デフォルトはシンボリックリンクをリンクとしてコピーする。転送先で/tmpとかが無かった場合、無効なリンクになるがリンクは作成される。

--safe-links (自分の配下外へのリンクがあるとそれはコピーしない)

$ rsync -e ssh -avzn --safe-links ./* remote-user@remote.host.example.com:~/work/20120629/
building file list ... done
bar
wat -> hoge/uki
foo/
ignoring unsafe symlink "/home/remote-user/work/20120629/foo/baz" -> "/tmp"
hoge/
hoge/uki/
hoge/uki/a
hoge/uki/b
hoge/uki/c
hoge/uki/d

sent 281 bytes received 74 bytes 710.00 bytes/sec
total size is 12 speedup is 0.03

--copy-links (全部辿ってファイルをコピーしてくれる)

$ rsync -e ssh -avzn --copy-links ./* remote-user@remote.host.example.com:~/work/20120629/
building file list ... done
bar
foo/
foo/baz/
foo/baz/mapping-root
foo/baz/scim-panel-socket:0-root
foo/baz/x8af17ba1c705910a1fdaa2cd7aa83f7
foo/baz/.ICE-unix/
foo/baz/.font-unix/
foo/baz/.font-unix/fs7100
hoge/
hoge/uki/
hoge/uki/a
hoge/uki/b
hoge/uki/c
hoge/uki/d
wat/
wat/a
wat/b
wat/c
wat/d

sent 780 bytes received 152 bytes 1864.00 bytes/sec
total size is 2172 speedup is 2.33

--copy-unsafe-links (「自分の配下から外れてるもののみ」をコピー)

$ rsync -e ssh -avzn --copy-unsafe-links ./* remote-user@remote.host.example.com:~/work/20120629/
building file list ... done
bar
wat -> hoge/uki
foo/
foo/baz/
foo/baz/mapping-root
foo/baz/scim-panel-socket:0-root
foo/baz/x8af17ba1c705910a1fdaa2cd7aa83f7
foo/baz/.ICE-unix/
foo/baz/.font-unix/
foo/baz/.font-unix/fs7100
hoge/
hoge/uki/
hoge/uki/a
hoge/uki/b
hoge/uki/c
hoge/uki/d

sent 723 bytes received 128 bytes 1702.00 bytes/sec
total size is 2180 speedup is 2.56

自分の中身を参照しているようなリンクはコピーしないで、むしろその逆の「自分の配下から外れてるもの*のみ*」をコピーしてくれる。

--keep-dirlinks シンボリックリンクを辿ってコピーしてくれる

コピー先にシンボリックリンクがあった場合、普通のアーカイブモードだとそのシンボリックリンクを実ファイルで上書きしてしまう。

シンボリックリンクはそのままにして、その先で変わってたファイルだけを見て欲しい場合はこのオプションを付ける。