web-dev-qa-db-ja.com

「検索」および「検索」のより高速な代替手段?

「検索」と「検索」を使用してプロジェクト内のソースファイルを検索したいのですが、実行に時間がかかります。知らないこれらのプログラムに代わる高速な方法や、パフォーマンスを高速化する方法はありますかこれらのプログラムの?

22
benhsu

プロジェクト内のソースファイルの検索

より簡単なコマンドを使用

通常、プロジェクトのソースは1か所にある可能性が高く、ネストされているサブディレクトリが2つまたは3つ以下である可能性があるため、次のような(おそらく)より高速なコマンドを使用できます。

_(cd /path/to/project; ls *.c */*.c */*/*.c)
_

プロジェクトのメタデータを利用する

Cプロジェクトでは通常、Makefileがあります。他のプロジェクトでは、似たようなものがあるかもしれません。これらは、ファイル(およびその場所)のリストを抽出する高速な方法であり、この情報を使用してファイルを検索するスクリプトを記述します。 「ソース」スクリプトがあるので、grep variable $(sources programname)のようなコマンドを記述できます。

検索の高速化

可能な場合は、_find / …_ではなく_find /path/to/project …_を使用して、検索する場所を減らします。選択基準をできるだけ簡略化します。パイプラインを使用して、より効率的な場合は、いくつかの選択基準を延期します。

また、検索の深さを制限できます。私にとっては、これにより「検索」の速度が大幅に向上します。 -maxdepthスイッチを使用できます。たとえば、「-maxdepth 5」

検索の高速化

目的の場所のインデックスを作成していることを確認してください。manページを読み、タスクに適したオプションを利用してください。

_   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.
_

検索の必要性を排除

多分あなたは何かがどこにあるか、言われなかったかを忘れてしまったので、あなたは探しています。前者の場合はメモ(ドキュメント)を書き、後者の場合は尋ねますか?慣習、標準、一貫性は多くの助けになります。

16
RedGrittyBrick

RedGrittyBrickの回答の「スピードアップ」の部分を使用しました。私はより小さいdbを作成しました:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

次にlocateを指さしました:locate -d /home/benhsu/ben.db

11
benhsu

私が使用する戦術は、find-maxdepthオプションを適用することです。

find -maxdepth 1 -iname "*target*"

探しているものが見つかるか、探していることに飽きるまで、深さを増して繰り返します。最初の数回の反復は瞬時に戻る可能性があります。

これにより、探しているものが階層のベースの近くにある可能性が高い場合に、大規模なサブツリーの深さを調べるのに前もって時間を無駄にしないことが保証されます。


このプロセスを自動化するスクリプトの例を次に示します(必要なものが表示されたらCtrl-C)。

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

関係する固有の冗長性(各パスは、前のパスで処理されたフォルダーを通過する必要があります)は、ディスクキャッシュを介して最適化されます。

組み込みの機能としてこの検索順序がfindにないのはなぜですか?多分冗長なトラバーサルが受け入れられないと想定した場合、実装が複雑/不可能になるためでしょう。 -depthオプションの存在は可能性を示唆していますが、残念ながら...

6
nobar

別の簡単な解決策は、新しい拡張シェルグロビングを使用することです。有効にする:

  • bash:shopt -s globstar
  • ksh:set -o globstar
  • zsh:すでに有効になっています

次に、トップレベルのソースディレクトリで次のようなコマンドを実行できます。

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

これには、すべてのサブディレクトリを再帰的に検索するという利点があり、非常に高速です。

3
dannyw

シルバーサーチャー

膨大な数のソースコードファイルの非常に高速な検索contentに役立つ場合があります。 ag <keyword>と入力します。ここに私のapt show silversearcher-agの出力のいくつか:

私は通常それを使って:

-G--file-search-regex PATTERN 名前がPATTERNに一致するファイルのみを検索します。

ag -G "css$" important

screenshot

3
Pablo A

代替品を見つけるには、 fd をチェックしてください。元の検索コマンドよりもシンプルで直感的なインターフェイスがあり、かなり高速です。

2
Keith Hughitt