rsync include 興奮が非常に遅いです。

rsync include 興奮が非常に遅いです。

rsyncパターンに一致するファイルのコピーに使用する場合https://unix.stackexchange.com/a/2503/288916これはうまくいきますが、非常に遅いです。find一致するファイルをすばやく見つけます。 (10倍以上速くなったようです。) これは正常ですか?これに取ることができる措置はありますか?

より良い戦略は、検索を使用し、一致する結果のみを1つずつコピーすることです(scpまたは使用rsync)。


コマンド例(このコマンドの機能については、リンクされた質問も参照してください):

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

ベストアンサー1

比較すると、find実際にrsyncリンゴをリンゴと比較するのではないことを覚えておいてください。

  • findソースファイルツリーのみをスキャンし、
  • rsyncソースファイルツリーをスキャンするだけでなく、ターゲットファイル(サイズ、日付時刻、権限、所有権)とメタデータを比較して、ソースファイルをターゲットファイルにコピーする必要があることを確認します。

私はGPFSに慣れていませんが、クラスタファイルシステムこれは、ネットワークによってファイルアクセスが制限される可能性があることを意味します。しかし、初めてファイルシステムを実行した後、Linuxベースのシステムは、メモリに基づいて後続のアクセスのためにファイルツリーをキャッシュしようとします。この最適化だけで、140,000個のファイルで構成されたツリーの速度を30倍向上させることができました。

rsync比較のために、質問に示されている実装に近い次のコードを検討できます。find合計を考慮する前にも、対応するmkdir生データより約200倍遅いことがわかりましたcp:操作を防ぐために無動作を前に付けます)。

cd ~/LaTeX &&
    find . -type f -name '*.pdf' |
        while IFS= read -r src
        do
            dst=~/Output/"$src"
            if [ ! -f "$dst" ] || [ "$(stat -c '%s-%Y' -- "$src")" != "$(stat -c '%s-%Y' -- "$dst")" ]
            then
                mkdir -p -- "${dst%/*}"
                cp -p -- "$src" "$dst"
            fi
        done

確かにそれほどスマートではありませんが、rsync私はこれが公正な出発点だと思います。

rsync最後に、次のコマンドを使用してファイルを選択することもfindできます。

cd ~/LaTeX &&
    find . -type f -name '*.pdf' -print0 |
        rsync -av --files-from - --from0 ./ ~/Output/

そうでない場合は、find … -print0交換して-print削除してください--from0。極端なファイル名(改行やその他の珍しい文字を含むファイル名)に問題がある可能性がありますが、ほとんどのファイル名では引き続き問題なく動作します。

おすすめ記事