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
。極端なファイル名(改行やその他の珍しい文字を含むファイル名)に問題がある可能性がありますが、ほとんどのファイル名では引き続き問題なく動作します。