2つの異なるシステム上のディレクトリを比較するために、rsync
のdry-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
(リンクをコピー)オプションの両方を追加しようとしましたが、効果はありませんでした。
ディレクトリ構造のシンボリックリンクでもこの比較を機能させるにはどうすればよいですか?
あなたが示したように、system/nrcalc
はローカルシステム上のシンボリックリンクですが、リモートサーバー上のディレクトリです。リモートシステムのディレクトリが空でない場合、--force
または--delete
オプションのいずれかを指定しない限り、rsyncは(シンボリックリンクを回避するために)ディレクトリの削除を拒否します。遠端のディレクトリを置き換えたくないが、ローカルのシンボリックリンクが指すコンテンツでそれを更新する必要がある場合は、--copy-dirlinks
を使用できます。
--dry-run
が指定されていても、Rsyncはこれについて不平を言っています。これは、望んでいることを行うには、遠端のディレクトリを削除する必要があるという事実を警告しています。私が-n
と組み合わせて言及したオプションのいずれかを使用すると、実際には何も削除せずにクリーンドライランが得られます。
あなたが試した他のオプションについては:
-K
オプション(--keep-dirlinks
)は、宛先側を除いて--copy-dirlinks
と同等です。シンボリックリンクがソース側にあるため、このオプションは効果がありませんでした。
-l
オプション(--links
)は、シンボリックリンクがシンボリックリンクとしてコピーされることを保証しますが、--force
または--delete
がない場合、rsyncは空でないディレクトリをシンボリックリンク。また、-a
は-l
を意味するので、とにかくずっと使用してきました。