検索対検索:お互いの使い方、長所、短所

検索対検索:お互いの使い方、長所、短所

Linux および Unix システムには、2 つの一般的な検索コマンドがあります。locateそしてfind

それぞれの長所と短所は何ですか?ある人が他の人よりも有利なときはいつですか?

答え1

locate(1)これに比べて唯一の大きな利点がありますfind(1)。まさにスピードです。

find(1)しかしたくさん利点locate(1):

  • find(1)オリジナルであり、AT&T Unixの最初のバージョンに戻る。組み込みLinuxの簡単なバージョンでも見つけることができます。by ビジーボックス。これはほぼ普遍的です。

    locate(1)それよりはるかに若いですfind(1)。最初の祖先はlocate(1) 1983年まで現れなかったlocate、1994年に採択されるまでは広く使われていませんでした。GNU findutilsと入力してくださいそして4.4BSDエントリー

  • locate(1)道路非標準そのため、デフォルトではどこにでもインストールされるわけではありません。一部のPOSIXタイプのオペレーティングシステムではこれをオプションとして提供するものもなく、使用可能な場合は必ず使用する必要がある最小機能セットを指定する独立した標準がないため、実装時に必要な機能が不足する可能性があります。

    一つある実は標準、はいBSDlocate(1)ただし、これは他の2つの基本スタイルがすべてのオプション(、、、、、、およびlocate)を-0実装しているためです。-c-d-i-l-m-s-SmlocateBSDにない6つの追加オプションを実装しました:、、、、およびlocateBSDにない実装-b-e-P-q--regex-w牛に似た一種の栄養locateこの6つと異なるものを実装してください。4つ-A、、、、そして。-D​ (vs vsのようなエイリアスとニュアンスは無視されます。)-E-p-?-h--help

    BSDMac OS XはBSDを提供していますlocate

    ほとんどのLinuxはGNUを提供しますlocateが、Red Hat LinuxとArchはmlocate代替を提供します。 Debian は、デフォルトのインストールに両方のバージョンをインストールしませんが、デフォルトのパッケージリポジトリに両方のバージョンをインストールする場合は、locate「」を実行しますmlocate

    OracleがmlocateSolarisでリリースされました。11.2から、2014年12月発売。以前は、locateSolarisにデフォルトでインストールされていませんでした。 (おそらくこれは、以下に関連するSolarisコマンドの数を減らすために行われました。Oracle Linux今すぐRed Hat Enterprise Linuxベース、も使用されますmlocate。 )

    IBM AIXまだバージョンがリリースされていませんがlocate少なくともAIX 7.2から開始findutilsGNUをインストールしていない場合Linuxアプリケーション用のAIXツールボックス

    HP-UX返品現れる基本システムが不足していますlocate

    長老「本物」Unix実装は通常含まれませんlocate

  • find(1)強力な表現構文と多くの機能を持っています。ブール演算子、等。

  • find(1)名前でファイルを選択するだけでは可能ではありません。以下から選択できます。

    • 年齢
    • サイズ
    • 所有者
    • ファイルタイプ
    • タイムスタンプ
    • 特権
    • サブツリー内の深さ...
  • 名前でファイルを検索するときは、次のように検索できます。ファイルグロービング構文すべてのバージョンfind(1)、またはGNUまたはBSDバージョンでは、以下を使用します。一般的な表現

    現在のバージョンはlocate(1)globパターンも受け入れますfindが、BSDはlocate正規表現をまったく実装していません。私と同じように、さまざまな種類のマシンで作業する必要がある場合は、greporの依存関係を開発するよりもフィルタリングを好むでしょう。-r--regex

    locateこれより強力なフィルタリングが必要findな理由は...

  • find(1)ファイルシステム全体が必ずしも検索されるわけではありません。通常、作業したいすべてのファイルを含む親ディレクトリである子ディレクトリを指します。実装の一般的な動作locate(1)は、パターンに一致するすべてのファイルをエクスポートしてgrepフィルタリングなどを実行してバーストサイズを減らすことです。

    (悪いヒント:locate /システム上のすべてのファイルのリストを提供することもできます!)

    locate(1)ユーザー権限に応じて出力を制限するいくつかのバリエーションがありますが、これは主要なオペレーティングシステムのデフォルトバージョンではslocate(1)ありません。locate

  • find(1)できる働くファイルの検索に加えて、見つかったファイルにアクセスすることもできます。最も強力で広くサポートされている演算子はありますが、-exec他の演算子もあります。たとえば、最近のGNUおよびBSD検索の実装には-delete演算子があります-execdir

  • find(1)リアルタイムで実行されるため、出力は常に最新の状態に保たれます。

    過去数時間または数日間更新されたデータベースに依存しているため、locate(1)出力は最新ではない可能性があります。 (これは古いキャッシュの問題.) このコインには両面があります。

    1. locate存在しなくなったファイルには名前を付けることができます。

      GNUには、見つかった各ファイルの名前を印刷する前にファイルが存在することを確認するフラグがありますが、locateこれは速度上の利点を一部排除し、BSDでは使用できません。mlocate-elocatelocate

    2. locate最後のデータベース更新以降に生成されたファイルには名前は付けられません。

    locate結果が間違っている可能性があることを知っているので、結果についてある程度不信になる方法を学びます。

    この問題を解決する方法はいくつかありますが、広く使用されている実装はありません。例えば、rlocateしかし、それは現れる最新のLinuxカーネルでは機能しません。

  • find(1)これを実行しているユーザーよりも多くの権限を持っていません。

    locateシステム内のすべてのユーザーにグローバルサービスを提供するため、プロセスはファイルシステム全体を見ることを期待updatedbrootています。これによりセキュリティの問題が選択されます。

    1. rootとして実行しますupdatedbが、出力ファイルをlocate実行するために特別な権限が必要ないように、誰でも読めるようにします。これにより、システム上のすべてのファイル名がすべてのユーザーに効果的に公開されます。これは実際の問題を引き起こすのに十分かもしれません。

      BSDは、locateMac OS XとFreeBSDでこのように構成されています。

    2. 読み取りのみでデータベースに書き込んrootだ後locate setuidこれにより、データベースを読み取ることができます。これがlocate実際に意味するのは、一般的に見えないファイルを表示しないようにオペレーティングシステムの権限システムを再実装する必要があることです。それはまた加える攻撃面特に危険にさらされたシステムルートアップグレード攻撃。

    3. locateデータベースファイルを所有する特別なユーザーまたはグループを作成し、そのユーザー/グループがデータベースを読み取れるようにlocateバイナリにタグを付けます。setuid/setgidこれ自体は特権上昇攻撃を防ぐことはできませんが、発生する可能性のあるダメージを大幅に軽減できます。

      mlocateこのように構成されています。Red Hat Enterprise Linux

      locateしかし、デバッガを使用または作成できる場合は、まだ問題があります。コアダンプデータベースの特権部分にアクセスできます。

    locateシステムの各ユーザーに対して個別に実行せずに、本当に「安全な」コマンドを生成する方法が見つかりませんでしたfind(1)

一般的に両方とも非常に便利です。locate(1)これは、名前で特定のファイルを見つけようとするとうまく機能します(ファイルが存在することを知っていますが、正確な場所を覚えていない場合)。find(1)検査する重点領域がある場合、または多くの利点が必要な場合には優れています。

答え2

locatefindファイルシステムを繰り返してファイルを探している間に定期的に更新する必要がある事前に構築されたデータベースを使用してください。

よりlocateはるかに高速ですが、findデータベース(キャッシュと見なすことができます)が更新されない場合は、潜在的に不正確になる可能性updatedbがあります(コマンドを参照)。

また、ファイル名と一致するパターンを使用してfind各属性でファイルをフィルタリングできるため、よりきめ細かく使用できます。locate

答え3

findUnixを初めて使用する場合、または一般ユーザーが使用している場合は、マニュアルページを注意深く読むことなくUnixを正常に使用することはできません。歴史的に、一部のバージョンではfindこのオプションはデフォルトで設定されておらず、-printこれによりユーザーの敵意が高まりました。

locate柔軟性は低下しますが、一般的な状況で使用する方がより直感的です。

答え4

検索の小さな欠点は、関心のあるファイルシステム領域を索引付けできないことです。 Linux Mint 17.2 などの Debian デスクトップシステムでは、/etc/updatedb.conf ファイルは、/tmp、/var/spool、/home/.ecryptfs など、特定の領域を考慮対象から除外するように構成されています。

/home/.ecryptfs を無視すると、暗号化されたディレクトリのファイル名が承認されていないユーザーに公開されるのを防ぎます。ただし、ホームディレクトリがecryptfsを使用して暗号化されている場合、これはホームディレクトリがインデックス化されていないことを意味するため、検索はホームディレクトリに何も見つからないことを意味します。これは本質的にあなたと私には役に立たないかもしれません。結果が見つからないだけでなく、updatebプロセスは何の利点もなく定期的にディスクをロードします。

関連情報