web-dev-qa-db-ja.com

検索と検索

ディスク上のファイルを検索するためのコマンドfindおよびlocateがあります。

findはファイルを検索するために必要なすべてのサブディレクトリを再帰的に処理するため、低速ですが最新であるのに対し、locateは時々(正確に)更新されるデータベースを使用することを知っていますただし、古い可能性のある結果を表示します。

他に違いはありますか?どの状況で、どちらを好むでしょうか? locateデータベースは通常いつ更新されますか?

29
Byte Commander

私はOliが好きなだけです(これはたくさんあります!)findコマンドについては、私は彼に同意しません。好きじゃない。

findコマンドには3分以上かかります

たとえば、次の簡単なコマンドを見てください。

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/Sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

/から始まるすべてを検索するには、findがかかります。デフォルトでは、一連のエラーメッセージが表示されます。探しているものを見つけるには、エラーメッセージを検索する必要があります。それでも、53時間`grep`文字列のすべてのファイルの検索に長い時間がかかる文字列をドライブ全体で検索するのは、grepよりも優れています

Findコマンドのパラメーターをいじって操作を改善できることは知っていますが、ここでのポイントは実行にかかる時間です。

locateコマンドの所要時間は1秒未満

では、locateを使用してみましょう。

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

locateコマンドは1秒もかかりません!

updatedbはデフォルトで1日に1回のみ実行されます

データベースの検索を更新するupdatedbコマンドは、デフォルトでは1日に1回しか実行されません。次を使用して、追加したばかりのファイルを検索する前に手動で実行できます。

$ time Sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

これには3秒かかりますが、findコマンドの3分以上と比較すると短いです。

Sudo crontab -eを更新して、下の行を追加しました:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

現在、updatedbが5分ごとに実行され、locateコマンドデータベースはほとんど常に最新です。

しかし、属性はありませんか?

パイプでlocate出力を他のコマンドに渡すことができます。たとえば、ファイル属性が必要な場合は、次を使用できます。

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

概要

locateの速度と使いやすさを示すために、この回答を投稿しました。他の人から指摘されたコマンドの欠点のいくつかに対処しようとしました。

findコマンドは、ファイルを見つけるためにディレクトリ構造全体を走査する必要があります。 locateコマンドには独自のデータベースがあり、比較すると非常に高速です。

8