Linuxその他では、rsync を使う
基本的な使い方は下記になると思います。というか、これ以外あまりしたことない。-v -h は表示に関するオプションなので特に必要ない。
>> rsync -avh /src/ /dest
気を付ける点は、コピー元(/src/)の指定の仕方。最後のディレクトリ区切り、スラッシュを付けるか、付けないかで挙動が変わる。
通常は最後のスラッシュを付ける。というか、ローカル内のコピーで、付けない場合の用途が僕には思いつかない。
複数のディレクトリを一つのディレクトリに集めるとかの場合は、スラッシュを付けない。
また、ローカルではなくリモートホストにまたがる場合は、-z で圧縮転送を指定するほうが効率的なのかも。
ディレクトリをミラーリングしたい
$ rsync -avhu --delete /home/user1/src/ /home/user2/dest/
同じユーザー、同じパーミッションとかだと、これでいいのですが、たとえばミラー先がリモートマシンの違うユーザーや違うプラットフォームだと、パーミッションや所属グループなどはコピーしたくないかもしれません。そういう場合は、-a
を指定した上で、パーミッションや所属グループをコピーを除外する--no-p, --no-g
を付ける。
また、リモートホストの場合は転送時圧縮した方がいいかもしれないので-z
をつけた方がいいかもしれません。
$ rsync -avhuz --delete --no-p --no-g /home/user1/src/ remote:/home/user2/dest/
再帰的にミラーリングして( -a )
、ミラー元にないファイルはミラー先で削除( --delete )
、パーミッションとグループはコピーしないし( --no-p --no-g )
、ミラー先に新しいファイルがあった場合はコピーをスキップ( -u )
。また、転送時に圧縮を使う( -z )
。
src1,src2,src3 をdestディレクトリにまとめたい
$ rsync -avh /mnt/a/src1 /mnt/b/src2 /mnt/c/src3 /mnt/dest
こうすると、/mnt/dest ディレクトリに集められる。しかし、ローカルだけでこんなことするケースが思いつかない・・・
複数のリモートホストの特定ディレクトリを一つにまとめるとか、かな???
コピー先のスラッシュの有り無しは特に意味を持たない。
また、コピー元、コピー先にリモートホストを指定する場合は、–no-o,–no-p,–no-g 等を適宜つけ、パーミッション、オーナー情報等をコピーしないようにする必要があるかも。
ディレクトリ構造のみのコピー
> rsync -a --include "*/" --exclude "*" src/ dest
コピー元のディレクトリ構造のみが欲しい、ということが種々のバックアップ用途では多々あります。その際は、上記のようにすればいいらしい。
使い勝手は悪いが、findとmkdirを使うことも可能。
> find src -type d -print0 | xargs --null -n9 -I{} mkdir -p "dest/{}"
もしくは、findだけでもいいかもしれない。
> find src -type d -exec mkdir -p "dest/{}" \;