「検索」と「検索」を使用してプロジェクト内のソースファイルを検索したいのですが、実行に時間がかかります。知らないこれらのプログラムに代わる高速な方法や、パフォーマンスを高速化する方法はありますかこれらのプログラムの?
より簡単なコマンドを使用
通常、プロジェクトのソースは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.
_
多分あなたは何かがどこにあるか、言われなかったかを忘れてしまったので、あなたは探しています。前者の場合はメモ(ドキュメント)を書き、後者の場合は尋ねますか?慣習、標準、一貫性は多くの助けになります。
RedGrittyBrickの回答の「スピードアップ」の部分を使用しました。私はより小さいdbを作成しました:
updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"
次にlocate
を指さしました:locate -d /home/benhsu/ben.db
私が使用する戦術は、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
オプションの存在は可能性を示唆していますが、残念ながら...
別の簡単な解決策は、新しい拡張シェルグロビングを使用することです。有効にする:
次に、トップレベルのソースディレクトリで次のようなコマンドを実行できます。
# grep through all c files
grep printf **/*.c
# grep through all files
grep printf ** 2>/dev/null
これには、すべてのサブディレクトリを再帰的に検索するという利点があり、非常に高速です。
膨大な数のソースコードファイルの非常に高速な検索contentに役立つ場合があります。 ag <keyword>
と入力します。ここに私のapt show silversearcher-ag
の出力のいくつか:
私は通常それを使って:
-G
--file-search-regex PATTERN
名前がPATTERNに一致するファイルのみを検索します。
ag -G "css$" important
代替品を見つけるには、 fd をチェックしてください。元の検索コマンドよりもシンプルで直感的なインターフェイスがあり、かなり高速です。