
新しく作成されたファイルをリモートサーバーに追加して、デフォルトのWebサーバーをリモートサーバーに同期させるようにrsyncを設定しようとしています。
これは私が使用するコマンドです:
rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar
ただし、Webサーバーは「--update」フラグにもかかわらず、実際にすべてのファイルを転送したようです。さまざまなフラグの組み合わせを試しましたが(例:「-a」を省略して「-uv」を使用)、何も役に立ちませんでした。新しく追加されたファイルのみを送信するようにrsyncコマンドを変更するにはどうすればよいですか?
答え1
からman rsync
:
--ignore-existing skip updating files that exist on receiver
--update
わずかに異なる操作を実行すると、予期しない結果が生じる可能性があります(参考資料を参照man rsync
)。
これにより、rsyncはターゲット上のすべてのファイルをスキップします。そして、修正時間はソースファイルよりも最新です。。 (既存のファイルの変更時間が元のファイルと同じ場合、サイズが異なるとファイルが更新されます。)
答え2
ソースサーバーとターゲットサーバーのユーザー/グループIDが異なるため、問題が発生する可能性があります。変更/新しいファイルだけでなく、すべてのファイルを転送するのと同じ状況にあります。解決策は-t
(代わりに-a
)および-P
(と同じ--partial --progress
)パラメータを使用することです。
rsync -h -v -r -P -t <source> <target>
または短いです(@ Manngoに感謝します)。
rsync -hvrPt <source> <target>
これは新しいファイルとすでに存在しますが、変更されたファイルのみを転送します。ユーザーやグループIDの同期など、機能するパラメータが多すぎます-a
。私の場合、ソースシステムとターゲットシステムには異なるユーザーとグループがあったため、機能しませんでした。したがって、-a
すべてのソースファイルとターゲットファイルは常に「異なる」ファイルと見なされます。
仕様:
-h
:人が読める数字-v
:冗談-r
: ディレクトリに再帰-P
:(--partial
部分的に転送されたファイルをアーカイブ)+
--progress
(転送中の進捗状況を表示)-t
:修正時間を維持
答え3
説明する問題は、/
末尾のソースディレクトリが欠落しているためです。その結果、rsync
すべてのファイルは2回コピーされます。 1つ目はに/foo/bar
、2つ目はに/foo/bar/bar
更新されます/foo/bar/bar
。
正しいコマンドは次のようにする必要があります。
rsync -avh -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar/ /foo/bar