バックアップと同期 (Linux他)

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/{}" \;