web-dev-qa-db-ja.com

ファイルの検索(検索)またはオートコンプリートはどのように機能しますか?

私はWindowsユーザーであり、ファイルを検索するときにすべてのインデックス作成と永遠の待機時間を備えたWindowsを使用していますが、Linuxでlocateが機能する速度やオートコンプリート(私が知っている)がどれほど高速であるかは驚くべきことです。

バックグラウンドでインデックス作成が行われていますか、またはこれはどのように達成されますか?私はまだかなりクリーンなインストールをしているので、これは時間とともに悪くなるかもしれませんが、Windowsでは、インデックス付けされていないフォルダーを検索したい瞬間に、数秒待つ必要があります。

8
oli206

Linuxでロケート作業やオートコンプリート(私が知っている)がどれほど速く機能するかは驚くべきことです。 ...バックグラウンドでインデックス作成が行われていますか、またはこれはどのように達成されますか?

これは実際には2つの完全に異なる質問です。

locateは、夜間のcronジョブによって更新されるインデックス(slocateはそれを/var/lib/slocate/に格納します)を使用します。この夜間のジョブ通常現地時間の午前1時または午前2時頃に実行され、システム全体(接続されているすべてのドライブを含む)を完全にスキャンします。結果のインデックスは、単にファイル名のリストです。

オートコンプリートはシェルによって処理されます。ほとんどのシステムはbashを使用するため、bash-completionはこれがどのように機能するかを管理するスクリプトのコレクションです。 (zshには同様の名前のコレクションがあり、他のほとんどのシェルには何らかの形の補完が組み込まれています。) Tab が押されると、シェルは、すでに入力した内容に基づいて、正確に何を完了する必要があるかを決定するスクリプトを実行します。次に、スクリプトは可能な補完のリストを生成します。これは、現在のディレクトリ内のファイルのリスト、または$PATH内の実行可能ファイルのリストである場合とそうでない場合があります。 locateコマンドは通常notこれに使用されます。

18
greyfade

通常、locateは、cronジョブ(たとえば、私のシステムでは/etc/cron.daily/mlocate)を介して1日に1回生成されるインデックスを使用します。基本的には、いくつかの最適化とインデックスデータ構造の構築を伴う完全なファイルシステムトラバーサルです。

シェルは、コマンドの完了におそらく内部キャッシュを使用しますが、グローバルインデックスファイルは使用しません。さらに、通常、Unixカーネルはdentry-cacheを維持します。つまり、ディレクトリリストなどで使用されるファイルディレクトリ情報をメモリにキャッシュします(存在しないファイルの統計情報を含む-逆キャッシュとも呼ばれます)。

5
maxschlepzig