web-dev-qa-db-ja.com

Locate / whereis / whichの違いは何ですか

locatewhereiswhichコマンドの基本的な違いは何ですか。

私が観察した基本的な違いは、locateはファイルシステム全体で関連するすべてのファイル名を見つけますが、whereisおよびwhichコマンドは、ファイルの場所(システム/ローカルアドレス)インストール済みアプリケーション。私の観察はどれくらい正確ですか?

これらのコマンドは内部でどのように実装されていますか。なぜlocateはダッシュ検索と比較して非常に高速に動作し、locateはファイルシステム階層全体でターゲット文字列に一致する特定のファイル名を検索する必要があるのですか?

13
Chinmaya B

whichは、プログラムのバイナリ実行可能ファイルを見つけます(PATHにある場合)。 man whichはより明確に説明しています:

現在の環境で実行されるファイル(またはリンク)のパス名を返します。引数が厳密にPOSIX準拠のシェルでコマンドとして指定されていた場合。これは、引数の名前と一致する実行可能ファイルのPATHを検索することにより行います。シンボリックリンクをたどりません。

whereisは、プログラムのバイナリ、ソース、およびマニュアルページファイルを検索します。例えば

$ whereis gimp
/usr/bin/gimp /usr/lib/gimp /etc/gimp /usr/share/gimp /usr/share/man/man1/gimp.1.gz

これらのコマンドの出力を引数としてls -lまたはfileに渡すことで、さらに詳細を取得できます。

$ ls -l $(which gimp)
lrwxrwxrwx 1 root root 8 Jun 30 19:59 /usr/bin/gimp -> gimp-2.8

$ file $(which gimp)
/usr/bin/gimp: symbolic link to gimp-2.8

locateは、パス内のどこかにパターンが指定されているすべてのファイルを実際に検索します。 names(フルパスではなく)に-bオプションを含むパターンが含まれるファイルとディレクトリのみを検索するように指示できます。通常はあなたが望むもので、扱いにくいリストを提供します。

locateは、定期的に(毎日1回、cronによって)更新されるバイナリデータベースを使用するため、高速です。 Sudo updatedbを実行して、自分で更新して、最近追加されたファイルが見つかるようにすることができます。

locateについてもう1つ-ファイルがまだ存在するかどうかは関係ないので、最近削除されたファイルが見つからないようにするには、-eを使用します。リストが長くなることがあるので、私はlessにもパイプします。通常私は:

Sudo updatedb && locate -b -e gimp | less

Unityのダッシュの仕組みについて説明します here - Zeitgeist を使用してシステムファイルのインデックスを作成し、使用パターンから学習し、他のアプリケーションがこのデータを利用できるようにします。 locateよりも多くの作業。

17
Zanna

単に

$ which samba

どのコマンドがPATH設定を介してリストされたプログラムのリストを検索します

$ whereis samba

whereisコマンドは、PATH設定に存在しないプログラムも検索します

$locate samba

また、ファイル名でファイルを検索しますが、ディレクトリ構造自体は検索せず、updatedbによって準備されたデータベースのみを検索します。そのため、検索は検索よりも高速ですが、精度は低くなります。例:

0
Nullpointer