ファイルシステムの最終変更タイムスタンプを信頼できる場合は、RsyncをUNIX / Linuxの「find」ユーティリティと組み合わせることにより、速度を上げることができます。「find」は、過去1日以内の最終変更時刻を示すすべてのファイルのリストを作成し、その短縮されたファイル/ディレクトリのリストのみをRsyncにパイプします。これは、Rsyncが送信側のすべての単一ファイルのメタデータをリモートサーバーと比較するよりもはるかに高速です。
要するに、次のコマンドは、過去24時間以内に変更されたファイルとディレクトリのリストに対してのみRsyncを実行します(Rsyncは、他のファイル/ディレクトリをチェックすることはありません)。
find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
「find」コマンドに慣れていない場合は、特定のディレクトリサブツリーを再帰処理し、指定した条件に一致するファイルやディレクトリを検索します。たとえば、次のコマンド:
find . -name '\.svn' -type d -ctime -0 -print
現在のディレクトリ( "。")で開始し、すべてのサブディレクトリを再帰的に検索して、以下を探します。
- 任意のディレクトリ(「-type d」)、
- ".svn"( "-name '.svn'")という名前、
- 過去24時間にメタデータが変更された(「-ctime -0」)
これらの基準に一致するもののフルパス名( "-print")を標準出力に出力します。オプション「-name」、「-type」、および「-ctime」は「テスト」と呼ばれ、オプション「-print」は「アクション」と呼ばれます。「検索」のマニュアルページには、テストとアクションの完全なリストがあります。
本当に賢くなりたい場合は、「-ctime」の代わりに「find」コマンドの「-cnewer」テストを使用して、このプロセスの耐障害性と柔軟性を高めることができます。'-cnewer'は、ツリー内の各ファイル/ディレクトリのメタデータが参照ファイルよりも最近変更されたかどうかをテストします。「タッチ」を使用して、各実行の開始時、「検索...」の直前に次の実行の参照ファイルを作成します。rsync ... 'コマンドが実行されます。基本的な実装は次のとおりです。
#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file
このスクリプトは、最後に実行された日時を自動的に認識し、最後の実行以降に変更されたファイルのみを転送します。これはより複雑ですが、ダウンタイムまたはその他のエラーのために24時間以上ジョブを実行できなかった状況から保護します。