「検索」と「検索」のより高速な代替手段


22

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


2
locate事前に作成されたインデックスを使用することを考慮すると、すでに十分に高速である必要があります(主な注意点は、最新の状態に保つ必要があることです)が、findディレクトリ一覧を読み取る必要があります。
フレイジャー

2
どのロケートを使用していますか?mlocateはslocateよりもはるかに高速です(インストールしたパッケージがどれであっても、コマンドは引き続き検出されるため、パッケージマネージャーを確認してください)
Paul

@ benhsu、find /usr/src -name fprintf.cOpenBSDデスクトップマシンで実行すると、それらのソースファイルの場所が10秒以内に返されます。locate fprintf.c | grep '^/usr/src.*/fprintf.c$'1秒以内に戻ってきます。「長時間実行」の定義は何ですか?また、どのように使用findlocateますか?
クサラナンダ

@ポール、私はmlocateを使用しています。
ベンス

@ KAK、find / locateの出力を使用して、emacsでファイルを開きます。私が念頭に置いているユースケースは、ファイルを編集したい、ファイル名(またはファイル名に一致する正規表現)をemacsに入力すると、emacsはfind / locateを使用してそれに一致するファイルのリストを表示することです、そのため、応答時間が十分に速く(1秒未満)インタラクティブになるようにします。$ HOMEには約300万のファイルがありますが、できることの1つは、findコマンドでいくつかのファイルを削除することです。
ベンス

回答:


16

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

より単純なコマンドを使用する

一般に、プロジェクトのソースは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.

検索の必要性を取り除く

あなたが何かを教えられた、または言われなかった場所を忘れたので、あなたは探しているかもしれません。前者の場合は、メモ(ドキュメント)を書き、後者の場合は尋ねますか?規則、標準、一貫性は大いに役立ちます。


10

RedGrittyBrickの回答の「ロケートを高速化する」部分を使用しました。私はより小さなデータベースを作成しました:

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

その後、それを指摘しlocateました:locate -d /home/benhsu/ben.db


6

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

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オプションの存在は可能性を示唆していますが、残念ながら...


1
...したがって、「幅優先」検索を実行します。
nobar

3

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

  • 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

シルバーサーチャー

膨大な数のソースコードファイルのコンテンツを非常に高速に検索するのに役立つことがあります。と入力するだけですag <keyword>。ここに私の出力の一部apt show silversearcher-ag

私は通常、それを以下で使用します:

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

ag -G "css$" important

スクリーンショット


1
ripgrepの algorythmが速くsilversearchより伝えられるところであり、そしてそれはまた、名誉.gitignoreファイルやスキップを.git.svn.hg...のフォルダ。
ccpizza

@ccpizzaだから?Silver Searcher.gitignore、デフォルトで隠しファイルとバイナリファイルを尊重し、無視します。また、より多くの貢献者、Githubでより多くの星を獲得し(14700対8300)、すでに市長ディストリビューションのリポジトリにいます。更新された信頼できるサードパーティのソース比較を提供してください。それにもかかわらず、ripgrep素晴らしいソフトウェアに見えます。
パブロ

知っておきたい!筆者とは一切関係ありません。ripgrep自分の要件に合っているため、他のオプションの検索を停止しました。
ccpizza

シルバーサーチャーも尊敬してい.gitignoreます。とrgは言っても、すごいことです。まず、ユニコードをサポートしています。私の経験でrgは、一貫してag(YMMV)の少なくとも2倍の速さで、Rustの正規表現パーサーが原因であると思います。明らかに、まだ数年前にはまだ準備ができていませんagでした。rg確定的な出力を提供できますが(デフォルトではそうではありません)、agホワイトリストのみが可能なファイルタイプをブラックリストに登録でき、サイズに基づいてファイルを無視できます(さようならログ)。ag複数行の一致が必要な場合は、まだ使用しますが、それrgはできません。
ペルマイスター

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.