4

サーバー上の何百万ものファイルを調べて、特定のサフィックスを持つファイルを見つける必要がある単純な検索コマンドがあります。ファイルは、時間の経過とともに非常に頻繁に書き込まれ、削除されます。検索を高速化する方法があるかどうか疑問に思っています。ロケート用のデータベースを作成するには非常にコストがかかるため、ロケートを使用することは論外です。

find /myDirWithThausandsofDirectories/ -name *.suffix

一部のサーバーでは、このコマンドに数日かかります!

何かご意見は?

ありがとう、

4

4 に答える 4

3

監査サブシステムを使用して、ファイルの作成と削除を監視できます。これをの最初の実行と組み合わせるとfind、リアルタイムで更新できるファイルのデータベースを作成できるはずです。

于 2012-04-11T17:39:40.753 に答える
3

分割統治 ?MP OS とプロセッサfindがサブフォルダごとに複数のコマンドを生成すると仮定します。

for dir in /myDirWithThausandsofDirectories/*
do find "$dir" -name "*.suffix" &
done

findサブディレクトリの数に応じて、特定の時間に実行するプロセス (コマンド)の数を制御したい場合があります。これは少しトリッキーですが、実行可能です (つまり、bash シェルを使用して、生成されたプロセスの pid を持つ配列を保持し、配列$!の長さに応じて新しいプロセスのみを許可します)。また、上記はルートディレクトリの下のファイルを検索しません。アイデアの簡単な例です。

プロセス管理が完了した方法がわからない場合は、学習する時間です ;) これは、このテーマに関する非常に優れたテキストです。 これは実際に必要なものです。しかし、それがどのように機能するかを理解するには、すべてを読んでください。

于 2012-04-11T17:41:55.833 に答える
0

単純なグロブを使用しているため、 Bash の再帰的なグロブを使用できる場合があります。例:

shopt -s globstar
for path in /etc/**/**.conf
do
    echo "$path"
done

よりもはるかに柔軟性の低い内部シェル機能を使用しているため、より高速である可能性がありfindます。

Bash を使用できないが、パスの深さに制限がある場合は、さまざまな深さを明示的にリストできます。

for path in /etc/*/*.conf /etc/*/*/*.conf /etc/*/*/*/*.conf
do
    echo "$path"
done
于 2012-04-12T09:09:11.933 に答える