見つけるvs見つける:互いの使用法、賛否両論


回答:


166

locate(1)唯一の大きな利点がありfind(1)ます:速度。

find(1)、しかし、多くの利点がありlocate(1)ます:

  • find(1)AT&T Unixの最初のバージョンに戻って、原始的です。Busybox を使用して、組み込みのLinux 削減することもできます。それはすべて普遍的です。

    locate(1)ははるかに若いですfind(1)。の最初の祖先はlocate(1) 1983年まで現れませんでしたがlocate1994年にGNU findutils4.4BSDに採用されるまで広く利用できませんでした。

  • locate(1)また、非標準であるため、デフォルトではどこにもインストールされません。一部のPOSIXタイプのOSはオプションとしても提供しておらず、利用可能な場合、最小機能セットを指定する独立した標準がないため、実装には必要な機能が欠けている場合があります。

    あるデファクトスタンダードがあること、BSDlocate(1)、それは唯一の理由は、他の二つの主要な味でlocateそのオプションのすべてを実装:-0-c-d-i-l-m-s、と-SmlocateBSDで6つの追加オプションを実装していないlocate-b-e-P-q--regex-wGNUは、locateこれらの6プラス別の実装4を-A-D-E、と-p。(エイリアスと-?vs -hvsのような小さな違いは無視しています--help

    BSDおよびMac OS XはBSDを出荷していlocateます。

    ほとんどのLinuxはGNUを出荷していますがlocatemlocate代わりにRed Hat LinuxとArchが出荷されています。Debianは、基本インストールでもインストールしませんが、デフォルトパッケージリポジトリで両方のバージョンを提供します。両方を一度にインストールすると、locate実行されmlocateます。

    Oracleは、2014年12月にリリースされた11.2からmlocate Solarisに出荷されています。それ以前は、Solarisにはデフォルトでインストールされていませんでした。(おそらく、これはとSolarisのコマンドの非互換性減らすために行われたオラクルのLinuxされ、Red Hat Enterprise Linuxに基づいても使用しています、。)locatemlocate

    IBM AIXはまだのいずれかのバージョンを出荷しないlocate少なくともAIX 7.2のようあなたがGNUをインストールしない限り、findutilsからのLinuxアプリケーションのAIXツールボックス

    HP-UXはまた、表示されます欠くlocateベースシステムに。

    古い「本物の」Unixには、一般にの実装が含まれていませんでしたlocate

  • find(1)多くの関数、ブール演算子などを備えた強力な式構文があります。

  • find(1)名前だけでなくファイルを選択できます。以下で選択できます。

    • 年齢
    • サイズ
    • オーナー
    • ファイルの種類
    • タイムスタンプ
    • 許可
    • サブツリー内の深さ...
  • ファイルを名前で検索する場合、正規表現を使用して、GNUまたはBSDバージョンのすべてのバージョンでファイルグロビング構文を使用して検索できます。find(1)

    現在のバージョンはlocate(1)グロブパターンを受け入れますfindが、BSD locateは正規表現をまったく行いません。あなたが私のような人で、さまざまな種類のマシンを使用する必要がある場合は、またはにgrep依存することを開発するよりもフィルタリングを好むことに気づきます。-r--regex

    locatefind理由よりも強力なフィルタリングが必要です...

  • find(1)必ずしもファイルシステム全体を検索するとは限りません。通常は、操作対象のすべてのファイルを含む親であるサブディレクトリをポイントします。locate(1)実装の一般的な動作は、パターンに一致するすべてのファイルを吐き出し、grepフィルタリングなどに任せて、噴火をサイズに縮小します。

    (邪悪なヒント:locate /おそらくシステム上のすべてのファイルのリストを取得します!)

    ユーザーの許可に基づいて出力を制限するlocate(1)類似のバリアントがありますがslocate(1)、これはlocate主要なオペレーティングシステムのデフォルトバージョンではありません。

  • find(1)見つけるだけでなく、見つけたファイルに対しても処理を行うことができます。最も強力で広くサポートされているこのような演算子はですが-exec、他にもあります。たとえば、最近のGNUおよびBSDの実装では、-deleteand -execdir演算子があります。

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

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

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

      GNU locatemlocateは、-e過去に発見した各ファイルの名前を出力する前にファイルの存在をチェックするフラグがありますが、これによりlocate速度の利点がいくらか失われ、BSD locateでは利用できません。

    2. locate 最後のデータベース更新以降に作成されたファイルの名前付けに失敗します。

    あなたはlocate、それが間違っているかもしれないことを知って、出力にいくらか不信感を持つことを学びます。

    この問題を解決する方法はありますが、広く使用されている実装を認識していません。例えば、そこにあるrlocateが、表示される任意の最近のLinuxカーネルに対して動作しないように。

  • find(1) それを実行しているユーザー以上の特権はありません。

    locateシステム上のすべてのユーザーにグローバルサービスを提供するため、ファイルシステム全体を表示できるようにupdatedbプロセスを実行rootする必要があります。これにより、セキュリティの問題が選択されます。

    1. updatedbrootとして実行しますが、出力ファイルを誰でも読めるようにして、locate特別な権限なしで実行できるようにします。これにより、システム内のすべてのファイルの名前がす​​べてのユーザーに効果的に公開されます。これは実際の問題を引き起こすのに十分なセキュリティ違反です。

      BSD locateは、Mac OS XおよびFreeBSDでこのように構成されています。

    2. データベースをでのみ読み取り可能なように書き込み、データベースを読み取れるrootようにlocate setuidrootを作成します。これはlocate、OSの許可システムを効果的に再実装する必要があるため、通常は表示できないファイルが表示されないことを意味します。また、システムの攻撃対象領域が拡大し、特にルートエスカレーション攻撃のリスクが高まります。

    3. locateデータベースファイルを所有する特別なユーザーまたはグループを作成し、そのユーザー/グループについてlocateバイナリをマークしてsetuid/setgid、データベースを読み取れるようにします。これは、特権エスカレーション攻撃自体を防止するものではありませんが、人が引き起こす可能性のある損害を大幅に軽減します。

      mlocateRed Hat Enterprise Linuxではこのように設定されています。

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

    locateシステム上の各ユーザーに対して個別に実行する以外に、真に「安全な」コマンドを作成する方法がわかりませんfind(1)

要するに、両方とも非常に便利です。locate(1)特定のファイルを名前で検索しようとしているだけで、存在することがわかっているが、正確にどこにあるか覚えていない場合に適しています。find(1)調査する対象領域がある場合、または多くの利点のいずれかが必要な場合に適しています。


申し訳ありませんが、「slocate」段落を見落としていました。rlocateは、古いキャッシュの問題に対処します。find -- "$dir" 堅牢ではない($dir述語として使用される)、シンボリックリンクの属性をテストする方法がない、競合状態の問題など、findの癖のいくつかに言及したい場合がfindありlocateます。findの使用が現実的でない場所はたくさんあります(数百万のファイルを含むディレクトリなど)。Locateは、ファイル名に限定されたインデックスシステムです。
ステファンシャゼル

2
の最初の実装は、locate大体次のようfind / -type f | gzip > locate.gzになりました。zgrep "$1" <locate.gz
F.ハウリ

@ F.Hauri:興味深いトリビア。さらに詳しく:GNU locatefindutilsパッケージに含まれており、そのupdatedbプログラムはの観点から実装されていfind(1)ます。その意味で、locate(1)実際にはが必要 find(1)です。:)
ウォーレンヤング

1
@WarrenYoungなぜただのfooではなくfoo(1)への定数参照があるのですか?fooの異なるバージョンなどはありますか?
ナッツについてのナッツ

4
@nuttyaboutnatty:ありませんがあることは事実ですが、マニュアルのセクション1を意味し、Unixのマニュアルでは、古代の慣習、だfindlocateそれは別のセクションで使用したのと同じ名前を明確にするためにそこにある必要はありませんので、他のセクションでなど、マニュアル(例:unlink(1)vs unlink(2))、慣習に慣れている人は、それをmanページのリファレンスとして参照します。
ウォーレンヤング

35

locate事前に構築されたデータベースを使用します。これは定期的に更新される必要がありfind、ファイルシステムを反復処理してファイルを見つけます。

したがって、locateはに比べてはるかに高速ですfindが、データベースが(キャッシュとして認識できるupdatedb)が更新されない場合は不正確になる可能性があります(コマンドを参照)。

また、ファイル名と一致するパターンfindlocate使用しながら、ファイルのすべての属性でファイルをフィルター処理できるため、より細かく設定できます。


7

findUnixの初心者またはときどきのユーザーが、manページを注意深く読まずに正常に使用することはできません。歴史的に、一部のバージョンはオプションをfindデフォルトにせず-print、ユーザーの敵意を増していました。

locate 柔軟性は劣りますが、一般的なケースでははるかに直感的に使用できます。


1
一方、locateはDBを維持し、定期的に実行する必要があるため、プライベートネットワーク上にあるすべてのLinuxサーバーでDBを無効にしました。
ルイFリベイロ

2
何が難しいの? find . -name 'nametosearch'、または-iname大文字と小文字を区別しません。.現在のディレクトリ以外を検索するには、ディレクトリパスに置き換えます。そこには、初心者ユーザーの要件の90%が、ファイルのグロビングを行うことなくカバーされています。(私は一般的に使用することになりfind . -iname '*partialfilename*'、私はから検索をしていた場合と/、私が使用find / -maxdepth 5 -iname '*partialname*':)。。私は、時間の90%に興味があるすべてのものを見つけることながら、検索時間をダウン切断するがあり、中間ユーザーの要件の75%)
ワイルドカード

2

Locateのわずかな欠点は、関心のあるファイルシステムの領域をインデックス付けしていない可能性があることです。LinuxMint 17.2などのDebianデスクトップシステムでは、/ etc / updatedb.confファイルは特定の領域を考慮から除外するように構成されます、/ tmp、/ var / spool、および/home/.ecryptfsを含む。

/home/.ecryptfsを無視すると、暗号化されたディレクトリ内のファイル名が許可されていないユーザーに公開されなくなります。ただし、ホームディレクトリがecryptfsで暗号化されている場合は、ホームディレクトリにインデックスが付けられていないため、locateはホームディレクトリ内で何も検出しません。これはあなたにとってほとんど役に立たないかもしれません(私にとってはそうです)。結果が見つからないことに加えて、updatedbプロセスは定期的にディスクをロードしますが、システムのメインユーザーまたは唯一のユーザーである場合は無効にされることもあります。

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