rsync - シンボリックリンクを使用した更新

rsync - シンボリックリンクを使用した更新

これは以下に関連しています。この問題しかし、私の考えにはその答えがここには適用されないようだ。

ディレクトリを互いに同期する2つのサーバーがあります。これらのディレクトリにはファイルとシンボリックリンクが含まれています。サーバー上第二、サーバーから同期します次のコマンドを使用します。rsync -auv A:dir/ dir/

私が望むもの: すべてのファイルまたはシンボリックリンクそのファイルやシンボリックリンクとは異なり、最新バージョンです。第二同期しました。

実際に何が起こったのか: すべてのファイルこのファイルは次のファイルとは異なり、最新バージョンです。第二同期しました。任意のシンボリックリンクこれは対応するシンボリックリンクとは異なります。第二すでに同期しています。タイムスタンプとは無関係

マニュアルページにはrsync次のものがあります(強調表示されています)。

-u、--更新

これにより、rsyncがターゲットに存在し、ソースファイルよりも変更時間が最新のすべてのファイルをスキップします。 (既存のファイルの変更時間が元のファイルと同じ場合、サイズが異なるとファイルが更新されます。)これはシンボリックリンクやその他の特殊ファイルのコピーには影響しません。

したがって、これは予想される動作です。なぜこれですか?回避策がありますか?または、サーバーがしばらくオフラインになってデータが失われた後にこれらのディレクトリを同期したままにするという全体的な目標を達成するための代替ソリューションはありますか?

私のrsyncバージョンは3.0.9

はい:私は2つのディレクトリを設定し、AdirBdirディレクトリには異なる内容のファイルとシンボリックリンクが含まれています。

$ ls -l Adir/ Bdir/
Adir/:
total 0
-rw-r--r-- 1 kevin kevin  5 May 27 18:00 file
lrwxrwxrwx 1 kevin kevin 10 May 27 18:00 symlink -> /some/file

Bdir/:
total 0
-rw-r--r-- 1 kevin kevin  6 May 27 17:00 file
lrwxrwxrwx 1 kevin kevin 16 May 27 17:00 symlink -> /some/other/file

実行rsync --dry-run -auv Adir/ Bdir/出力は次のとおりです。

sending incremental file list
./
file
symlink -> /some/file

sent 101 bytes  received 21 bytes  244.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

これがまさに私が期待したものです。ファイルとシンボリックリンクを最新の状態にコピーします(練習を実行していない場合)。ただし、実行rsync --dry-run -auv Bdir/ Adir/結果は次のとおりです。

sending incremental file list
./
symlink -> /some/other/file

sent 104 bytes  received 18 bytes  244.00 bytes/sec
total size is 22  speedup is 0.18 (DRY RUN)

Bdir/symlinkそれより古い場合でも、Adir/symlinkまだ同期されます。

答え1

1つの回避策は、rsyncのシンボリックリンクを無視して別々に実行することです。たとえば、tar最新のターゲットを上書きしないように要求します。例えば

( cd Adir; find . -type l |
  tar cf - -T- 
) |
tar xvvf - --keep-newer-files -C Bdir

関連情報