この find コマンドを最適化しようとしています。さらなる処理のために、1つの束(時にはほぼ100万)のファイルをディレクトリに移動する必要があります。多数のファイルを実行するのに数時間かかることがあるので、このコマンドを高速化する方法を探しています。問題は、まだ記録されているファイルを移動したくないため、移動する前にファイルを少なくとも1分間保持する必要があることです。
find path -name *.cdr.xml -mmin +1 -exec mv {} /path
編集する:このコマンドはPythonスクリプトの一部として実行され、Pythonスクリプトの実行を続行するには、すべてのファイルを見つけて移動するのを待つ必要があります。
すべてのファイル名はUUIDです。
答え1
フォークが一度だけ発生するエンディングを使用すると、パフォーマンスが向上する可能性があります+
。-exec
find
-exec
;
そして の場合、-exec
毎回新しいパラメータをフォークします。
したがって、次のものを使用できます。
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -t /path {} +
ファイル名が重複する可能性がある場合:
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -it /path {} +
または
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv --backup=numbered -t /path {} +
--backup=numbered
mv
ターゲットのファイル名が同じ場合、上書きされない番号付きファイルバックアップが作成されます。
答え2
ウォッチドッグを見ることができます(https://github.com/gorakhargosh/watchdog/)Pythonですべてのロジックを維持するには、ディレクトリを観察し、変更なしで1分後に各ファイルを移動できます。
別の解決策は、次のものを使用することです。同期すべてのファイル転送探す構成の代わりに出力-実現する。
いくつかの説明:
find ... -exec ... \;
->各結果に対してコマンドを実行するため、オーバーヘッドが多く追加され、非常に遅くなります。
find ... -exec ... +
->これにより、すべての結果がリンクされ、コマンドは一度だけ実行されます。これは非常に高速ですが、コマンドのシェル文字制限に達する可能性があります(特に数百万のファイルの場合)。
今は同期:
find path -name *.cdr.xml -mmin +1 -print0 | rsync --remove-source-files -0 --files-from=- ${DESTINATION}
説明する:
find ... -print0 |
->これにより、NULLで区切られたすべての結果が、もう一方の端でrsyncによって処理されるパイプに渡されます。
--remove-source-files
->のように説明は必要ありませんmv
。
--files-from=-
-> パイプの標準入力から読み込みます。
-0
-> パイプの行の代わりに NULL で終わるリストを読み込みます。
なぜNULLですか? ...作業速度を少し上げるために、NULLは新しい行よりも少ないバイトを占め、それを百万に増やすことで多くのバイトを節約できます。