web-dev-qa-db-ja.com

rsyncがシンボリックリンクについて文句を言う

2つの異なるシステム上のディレクトリを比較するために、rsyncdry-run(-n)オプションを使用しています。すべてが標準のファイルとディレクトリで正常に動作します。しかし、シンボリックリンクを含むディレクトリを使用すると、エラーが発生します。

> ls -l /usr/user1/server10s/system/
total 1
lrwxrwxrwx   1 localuser  other         37 Jun 19 17:18 nrcalc -> /usr/user2/nrcalc10s
> rsync -n -avrc /usr/user1/server10s/* aisdba@Server:deployment_area/server
building file list ... done
system/
cannot delete non-empty directory: system/nrcalc
could not make way for new symlink: system/nrcalc
template/
template/nrcalc
sent 190 bytes  received 24 bytes  38.91 bytes/sec
total size is 330  speedup is 1.54
rsync error: some files could not be transferred (code 23) at main.c(692)

実際には何も変更しようとしていないので、ディレクトリを削除できないのは非常にうれしいですが、なぜ変更しようとしているのですか?ところで、私は-l(リンク)オプションと-K(リンクをコピー)オプションの両方を追加しようとしましたが、効果はありませんでした。

ディレクトリ構造のシンボリックリンクでもこの比較を機能させるにはどうすればよいですか?

7
rojomoke

あなたが示したように、system/nrcalcはローカルシステム上のシンボリックリンクですが、リモートサーバー上のディレクトリです。リモートシステムのディレクトリが空でない場合、--forceまたは--deleteオプションのいずれかを指定しない限り、rsyncは(シンボリックリンクを回避するために)ディレクトリの削除を拒否します。遠端のディレクトリを置き換えたくないが、ローカルのシンボリックリンクが指すコンテンツでそれを更新する必要がある場合は、--copy-dirlinksを使用できます。

--dry-runが指定されていても、Rsyncはこれについて不平を言っています。これは、望んでいることを行うには、遠端のディレクトリを削除する必要があるという事実を警告しています。私が-nと組み合わせて言及したオプションのいずれかを使用すると、実際には何も削除せずにクリーンドライランが得られます。

あなたが試した他のオプションについては:

  • -Kオプション(--keep-dirlinks)は、宛先側を除いて--copy-dirlinksと同等です。シンボリックリンクがソース側にあるため、このオプションは効果がありませんでした。

  • -lオプション(--links)は、シンボリックリンクがシンボリックリンクとしてコピーされることを保証しますが、--forceまたは--deleteがない場合、rsyncは空でないディレクトリをシンボリックリンク。また、-a-lを意味するので、とにかくずっと使用してきました。

7