「検索」コマンドの最適化/交換

「検索」コマンドの最適化/交換

この find コマンドを最適化しようとしています。さらなる処理のために、1つの束(時にはほぼ100万)のファイルをディレクトリに移動する必要があります。多数のファイルを実行するのに数時間かかることがあるので、このコマンドを高速化する方法を探しています。問題は、まだ記録されているファイルを移動したくないため、移動する前にファイルを少なくとも1分間保持する必要があることです。

find path -name *.cdr.xml -mmin +1 -exec mv {} /path

編集する:このコマンドはPythonスクリプトの一部として実行され、Pythonスクリプトの実行を続行するには、すべてのファイルを見つけて移動するのを待つ必要があります。

すべてのファイル名はUUIDです。

答え1

フォークが一度だけ発生するエンディングを使用すると、パフォーマンスが向上する可能性があります+-execfind-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=numberedmvターゲットのファイル名が同じ場合、上書きされない番号付きファイルバックアップが作成されます。

答え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は新しい行よりも少ないバイトを占め、それを百万に増やすことで多くのバイトを節約できます。

関連情報