web-dev-qa-db-ja.com

新しいファイルのみをrsyncする方法

新しく生成されたファイルをリモートサーバーに追加して、メインWebサーバーをリモートサーバーに同期するようにrsyncを設定しようとしています。

これが私が使用するコマンドです:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

しかし、「-update」フラグにもかかわらず、Webサーバーは実際にすべてのファイルを転送するようです。私はさまざまなフラグの組み合わせを試しました(たとえば、代わりに「-a」を省略して「-uv」を使用)。新しく追加したファイルのみを送信するようにrsyncコマンドを変更するにはどうすればよいですか?

164
supermario

man rsyncから:

--ignore-existing       skip updating files that exist on receiver

--updateは少し異なる動作を行います。これが、予期しない結果が発生する理由です(man rsyncを参照)。

これにより、rsyncは宛先に存在するすべてのファイルを強制的にスキップしますおよびソースファイルよりも新しい変更された時間を持っています。 (既存の宛先ファイルの変更時間がソースファイルと同じ場合、サイズが異なると更新されます。)

210
Chris Down

私の場合、同様の問題があり、変更された/新しいファイルだけでなく、すべてのファイルが転送されていました。パラメータ-t-aの代わりに)、および-P--partial --progressと同等)を使用してこれを解決しました。

rsync -h -v -r -P -t ソースターゲット

これにより、新しいファイルと、既存の変更されたファイルのみが転送されます:-aは、ユーザーとグループIDの同期のように多すぎます。私の場合、ソースシステムとターゲットシステムに異なるユーザーとグループがあるため、機能しません。

詳細なパラメータ:

  • -h:人間が読める数字
  • -v:詳細
  • -r:ディレクトリに再帰します
  • -P--partial(部分的に転送されたファイルを保持)+
    --progress(転送中の進行状況を表示)
  • -t:変更時刻を保持
43
t0r0X

私のrsyncの経験から、1TBのパーティションのコピーは大きすぎて効率的ではありません。それを処理するには、rsyncが永遠にかかります。代わりに、サブディレクトリごとに実行してください。つまり、メインのサブディレクトリごとにrsyncを実行します。何万ものファイルを処理する必要がない場合は、はるかに高速になります。

2