回答:
locate(1)
唯一の大きな利点がありfind(1)
ます:速度。
find(1)
、しかし、多くの利点がありlocate(1)
ます:
find(1)
AT&T Unixの最初のバージョンに戻って、原始的です。Busybox を使用して、組み込みのLinux を削減することもできます。それはすべて普遍的です。
locate(1)
ははるかに若いですfind(1)
。の最初の祖先はlocate(1)
1983年まで現れませんでしたが、locate
1994年にGNU findutilsと4.4BSDに採用されるまで広く利用できませんでした。
locate(1)
また、非標準であるため、デフォルトではどこにもインストールされません。一部のPOSIXタイプのOSはオプションとしても提供しておらず、利用可能な場合、最小機能セットを指定する独立した標準がないため、実装には必要な機能が欠けている場合があります。
あるデファクトスタンダードがあること、BSDlocate(1)
、それは唯一の理由は、他の二つの主要な味でlocate
そのオプションのすべてを実装:-0
、-c
、-d
、-i
、-l
、-m
、-s
、と-S
。mlocate
BSDで6つの追加オプションを実装していないlocate
:-b
、-e
、-P
、-q
、--regex
と-w
。GNUは、locate
これらの6プラス別の実装4を:-A
、-D
、-E
、と-p
。(エイリアスと-?
vs -h
vsのような小さな違いは無視しています--help
)
BSDおよびMac OS XはBSDを出荷していlocate
ます。
ほとんどのLinuxはGNUを出荷していますがlocate
、mlocate
代わりにRed Hat LinuxとArchが出荷されています。Debianは、基本インストールでもインストールしませんが、デフォルトパッケージリポジトリで両方のバージョンを提供します。両方を一度にインストールすると、locate
実行されmlocate
ます。
Oracleは、2014年12月にリリースされた11.2からmlocate
Solarisに出荷されています。それ以前は、Solarisにはデフォルトでインストールされていませんでした。(おそらく、これはとSolarisのコマンドの非互換性減らすために行われたオラクルのLinuxされ、Red Hat Enterprise Linuxに基づいても使用しています、。)locate
mlocate
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
locate
find
理由よりも強力なフィルタリングが必要です...
find(1)
必ずしもファイルシステム全体を検索するとは限りません。通常は、操作対象のすべてのファイルを含む親であるサブディレクトリをポイントします。locate(1)
実装の一般的な動作は、パターンに一致するすべてのファイルを吐き出し、grep
フィルタリングなどに任せて、噴火をサイズに縮小します。
(邪悪なヒント:locate /
おそらくシステム上のすべてのファイルのリストを取得します!)
ユーザーの許可に基づいて出力を制限するlocate(1)
類似のバリアントがありますがslocate(1)
、これはlocate
主要なオペレーティングシステムのデフォルトバージョンではありません。
find(1)
見つけるだけでなく、見つけたファイルに対しても処理を行うことができます。最も強力で広くサポートされているこのような演算子はですが-exec
、他にもあります。たとえば、最近のGNUおよびBSDの実装では、-delete
and -execdir
演算子があります。
find(1)
リアルタイムで実行されるため、その出力は常に最新です。
locate(1)
過去数時間または数日更新されたデータベースに依存しているため、その出力は古くなる可能性があります。(これは古いキャッシュの問題です。)このコインには2つの側面があります。
locate
存在しないファイルに名前を付けることができます。
GNU locate
にmlocate
は、-e
過去に発見した各ファイルの名前を出力する前にファイルの存在をチェックするフラグがありますが、これによりlocate
速度の利点がいくらか失われ、BSD locate
では利用できません。
locate
最後のデータベース更新以降に作成されたファイルの名前付けに失敗します。
あなたはlocate
、それが間違っているかもしれないことを知って、出力にいくらか不信感を持つことを学びます。
この問題を解決する方法はありますが、広く使用されている実装を認識していません。例えば、そこにあるrlocate
が、表示される任意の最近のLinuxカーネルに対して動作しないように。
find(1)
それを実行しているユーザー以上の特権はありません。
locate
システム上のすべてのユーザーにグローバルサービスを提供するため、ファイルシステム全体を表示できるようにupdatedb
プロセスを実行root
する必要があります。これにより、セキュリティの問題が選択されます。
updatedb
rootとして実行しますが、出力ファイルを誰でも読めるようにして、locate
特別な権限なしで実行できるようにします。これにより、システム内のすべてのファイルの名前がすべてのユーザーに効果的に公開されます。これは実際の問題を引き起こすのに十分なセキュリティ違反です。
BSD locate
は、Mac OS XおよびFreeBSDでこのように構成されています。
データベースをでのみ読み取り可能なように書き込み、データベースを読み取れるroot
ようにlocate
setuid
rootを作成します。これはlocate
、OSの許可システムを効果的に再実装する必要があるため、通常は表示できないファイルが表示されないことを意味します。また、システムの攻撃対象領域が拡大し、特にルートエスカレーション攻撃のリスクが高まります。
locate
データベースファイルを所有する特別なユーザーまたはグループを作成し、そのユーザー/グループについてlocate
バイナリをマークしてsetuid/setgid
、データベースを読み取れるようにします。これは、特権エスカレーション攻撃自体を防止するものではありませんが、人が引き起こす可能性のある損害を大幅に軽減します。
mlocate
Red Hat Enterprise Linuxではこのように設定されています。
ただし、デバッガーを使用しlocate
たり、コアをダンプしたりできる場合は、データベースの特権部分を取得できるため、まだ問題があります。
locate
システム上の各ユーザーに対して個別に実行する以外に、真に「安全な」コマンドを作成する方法がわかりませんfind(1)
。
要するに、両方とも非常に便利です。locate(1)
特定のファイルを名前で検索しようとしているだけで、存在することがわかっているが、正確にどこにあるか覚えていない場合に適しています。find(1)
調査する対象領域がある場合、または多くの利点のいずれかが必要な場合に適しています。
find -- "$dir"
堅牢ではない($dir
述語として使用される)、シンボリックリンクの属性をテストする方法がない、競合状態の問題など、findの癖のいくつかに言及したい場合がfind
ありlocate
ます。findの使用が現実的でない場所はたくさんあります(数百万のファイルを含むディレクトリなど)。Locateは、ファイル名に限定されたインデックスシステムです。
locate
大体次のようfind / -type f | gzip > locate.gz
になりました。zgrep "$1" <locate.gz
locate
はfindutils
パッケージに含まれており、そのupdatedb
プログラムはの観点から実装されていfind(1)
ます。その意味で、locate(1)
実際にはが必要 find(1)
です。:)
find
、locate
それは別のセクションで使用したのと同じ名前を明確にするためにそこにある必要はありませんので、他のセクションでなど、マニュアル(例:unlink(1)
vs unlink(2)
)、慣習に慣れている人は、それをmanページのリファレンスとして参照します。
locate
事前に構築されたデータベースを使用します。これは定期的に更新される必要がありfind
、ファイルシステムを反復処理してファイルを見つけます。
したがって、locate
はに比べてはるかに高速ですfind
が、データベースが(キャッシュとして認識できるupdatedb
)が更新されない場合は不正確になる可能性があります(コマンドを参照)。
また、ファイル名と一致するパターンfind
をlocate
使用しながら、ファイルのすべての属性でファイルをフィルター処理できるため、より細かく設定できます。
find
Unixの初心者またはときどきのユーザーが、manページを注意深く読まずに正常に使用することはできません。歴史的に、一部のバージョンはオプションをfind
デフォルトにせず-print
、ユーザーの敵意を増していました。
locate
柔軟性は劣りますが、一般的なケースでははるかに直感的に使用できます。
find . -name 'nametosearch'
、または-iname
大文字と小文字を区別しません。.
現在のディレクトリ以外を検索するには、ディレクトリパスに置き換えます。そこには、初心者ユーザーの要件の90%が、ファイルのグロビングを行うことなくカバーされています。(私は一般的に使用することになりfind . -iname '*partialfilename*'
、私はから検索をしていた場合と/
、私が使用find / -maxdepth 5 -iname '*partialname*'
:)。。私は、時間の90%に興味があるすべてのものを見つけることながら、検索時間をダウン切断するがあり、中間ユーザーの要件の75%)
Locateのわずかな欠点は、関心のあるファイルシステムの領域をインデックス付けしていない可能性があることです。LinuxMint 17.2などのDebianデスクトップシステムでは、/ etc / updatedb.confファイルは特定の領域を考慮から除外するように構成されます、/ tmp、/ var / spool、および/home/.ecryptfsを含む。
/home/.ecryptfsを無視すると、暗号化されたディレクトリ内のファイル名が許可されていないユーザーに公開されなくなります。ただし、ホームディレクトリがecryptfsで暗号化されている場合は、ホームディレクトリにインデックスが付けられていないため、locateはホームディレクトリ内で何も検出しません。これはあなたにとってほとんど役に立たないかもしれません(私にとってはそうです)。結果が見つからないことに加えて、updatedbプロセスは定期的にディスクをロードしますが、システムのメインユーザーまたは唯一のユーザーである場合は無効にされることもあります。