rsync dstタイムスタンプがsrcでコンテンツが最後に送信された時刻を反映させるにはどうすればよいですか?

rsync dstタイムスタンプがsrcでコンテンツが最後に送信された時刻を反映させるにはどうすればよいですか?

ネットワーク経由でsrcからdstにファイルを同期しています。 Linuxのマニュアルページで多くのrsyncオプションを検索しているので、助けが必要です。

ターゲットのプロセスは、ソースから「新しく到着した」ファイルに応答します。たとえば、ソースファイルが2日前に変更されたがrsync5分前に転送されなかったとします。最新のタイムスタンプに基づいて新しく到着したファイルを検出できます。

したがって、必要なタイムスタンプ操作が必要です。

  • dstファイル変更タイムスタンプは、rsync転送によってエントリが最後に追加された時刻を示す必要があります。
  • rsyncが新しいコンテンツを送信せずにsrcとdstを比較するとき、つまりdstがすでにsrcと一致している場合は、dstファイル変更タイムスタンプを変更しないでください。

どのrsyncオプションが望ましい動作を提供しますか?

答え1

これを効果的に実行することはできません。rsyncネットワークを介した長い転送を短縮する主な手段としてタイムスタンプを使用してください。

このタイムスタンプ操作を本当にしたい場合は、

  1. rsyncターゲットファイルのタイムスタンプは、転送によってコンテンツが最後に追加された時間を示す必要があります。
  2. rsync新しいコンテンツを転送せずにソースとターゲットを比較するときは、ターゲットファイルのタイムスタンプを変更しないでください。

その後、すべてのファイル転送の考慮事項については、最大で各ファイルの完全なチェックサムで終了します。したがって、100個のファイルを転送し、その100個のファイルがソースとターゲットの両方に存在する場合は、実行されるrsyncたびに100個のファイルがすべてチェックサムを介して変更されたことを確認します。想像できるように、これは非常に非効率的です。

rsync --archive --no-times --checksum /source/path remotehost:/destination/path

ユースケースについては説明していませんが、一般的な使い方は、rsyncファイル修正時間を転送して送信されたように見えるファイル転送を防ぐことです。

rsync --times /source/path remotehost:/destination/path    # or --archive

いつものように--archive= -a--times= -t--no-times= --no-t--checksum=-c

答え2

増分バックアップのユースケースを作成しているようです。

srcディレクトリ(または少なくともsrcホスト)にファイルを保持します。

$ date +%s >> backed_up.txt

ブックファイルはmtime常に最新のバックアップが開始された時刻と一致します。find . -newer backed_up.txt -type fタイムスタンプを比較し、転送したいファイルのリストを生成するために使用されます。rsyncリストを提供し、--archiveまたは他の方法を使用してそのタグをdstディレクトリに保存します。


ここで重要なのは、ターゲットファイルのタイムスタンプの保存または使用方法を変更しようとしないことです。私たちは分離モデリング作業は、隣の簿記ファイルに入れました。だからfind/rsync使用それ既存のファイルシステムに新しい使用法を適用するのではなく、タイムスタンプを使用します。


これは、ターゲットホストが「新しく到着した」ファイルを検出する方法です。stat()ファイル名だけを解決するため、mtimeを繰り返し呼び出すよりも安価です。一意のファイル名はすぐに再利用/追加されないと仮定します。

#! /bin/bash

mv recent.{txt,old}
find some/dir -print | sort  > recent.txt
NEW=$(comm -1 -3 recent.{old,txt})

これで、処理フェーズで必要なものにfor FILE in $NEW最も近いファイル名を入力して繰り返すことができます。xargs


このアプローチは標準ユーティリティに依存します。 コミュニケーション。 GNUに表示されます テキストツール

関連情報