検索と検索


30

そこのコマンドがあるfindlocate、ディスク上のファイルを検索します。

私は、findファイルを検索するために必要なすべてのサブディレクトリを再帰的に処理するため、時間がかかりますが最新であるのに対してlocate、時々更新されるデータベースを使用して(正確に?)

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



1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html「updatedbは通常、cron(8)によって毎日実行され、デフォルトのデータベースを更新します。」
リンツウィンド

@RinzwindリンクされたU&Lの答えは素晴らしいです。クロスサイトの複製を作成できないのは残念です。しかし、cronjobについて、それが正確にいつ実行されるのかをもっと知っていますか?起動後?特定の時間(私は1-2AMまたはそのようなものを読んだと思います)のみですか?そのときにシャットダウンするとどうなりますか?コンピューターがアイドル状態のときに起動しますか?データベースの年齢を確認するにはどうすればよいですか?
バイトコマンダー

2
@ByteCommander-それanacronが目的です。デスクトップシステム/サーバーにデフォルトでインストールされているかどうかはわかりませんが、ノートブックにあります。ブート時に実行され、システムがオフのときにcronジョブが実行される必要があるかどうかを確認して実行します。これは非常に役立ちますが、深夜から遠く離れた場所でスケジュールされたジョブがある場合、いくつかの問題を引き起こす可能性があります。時間が立ち上がるときには、ジョブが再び起動時に実行し、されることがあります-未満24時間後に、おそらく多くの(毎日の仕事のため。)
ジョー・

@Joeそれでは、起動中に実行して速度を落とすのでしょうか、それとも起動後しばらくして実行するのでしょうか、それとも通常、システムがほとんどアイドル状態のときに実行するような低い優先度で実行するのでしょうか?
バイトコマンダー

回答:


27

locateファイルを見つけて人間に表示するためにのみ本当に良いです。あなたはそれでいくつかのことをすることができますが、私はそれを解析するのに十分信頼していません。そしてあなたが言うように、内部データベースの状態を保証することは不可能/etc/cron.daily/mlocateです。

findライブです。フィルタリング、除外、実行します。解析に適しています。相対パスを出力できます。フルパスを出力できます。名前だけでなく、属性に基づいて処理を実行できます。

locate確かに私のツールボックスには場所がありますが、通常は何かを見つけるための最後の努力として一番下にあります。それはfindあまりにも簡単です。


2
locateファイルシステム全体を検索する場合、はるかに高速であることがわかります。また、使用updatedbする前にデータベースを手動で更新できます。
hytromo

そのcronjobがどのように正確に構成されているか知っていますか?特定の時間に実行されますか、それともシステムがアイドル状態にあるか、起動からn分後に実行されますか?マシンが通常オフになっているときに、午前1時から2時の間にスケジュールされていることをどこかで読んだと思うからです。手動(sudo updatedb)を除き、更新されることはありませんか?また、データベースがどれくらい古いかを確認する機会はありますか?
バイトコマンダー

grep run-parts /etc/crontabこれらが管理されてanacronいることがわかります(これman anacronは、常に稼働していないシステムに対してより回復力があります)。私が見ることができるものから、元のcron時間を逃した場合、代わりに起動時に実行する必要があります。
オリ

2
Locateはリムーバブル/アンマウントパーティションのインデックスを作成しないので、何かを見つけたい場合はfindを使用する必要があります。もちろん、locateにはfindの優れたオプションがすべて備わっているわけではありません- -exec command {} \;見つかったすべてのファイルに対してコマンドを実行したいのです。私は、locate -blocateを、名前の最後のコンポーネントに一致するファイルの検索に制限する-残りのパスなしで使用するのが好きです。それがとても速いので、私はしばしばそれを最初に試みます。また、sudo updatedbロケートデータベースを更新するときにいつでも実行できます。
ジョー

多少簡単なリアルタイム検索が必要な場合は、次のようなものを使用できますls -R | grep 'file_name.txt'
ジェナ

8

私はオリが好きなのと同じくらいです(これはたくさんあります!)私は彼の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

これは、引き継ぎ3分のために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

探しコマンドは秒未満を取ります!

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

現在、5分ごとにupdatedb実行され、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コマンドには独自のデータベースがあり、比較すると非常に高速です。


@EliahKaganしかし、findコマンドは、すべてのドライブとパーティション上のすべてのディレクトリとファイルをスクロールして一覧表示していました。動作しているように見え、最後に印刷することを期待していました。実行にlocate / display-auto-brightnessは17秒かかり、すべてのディスク上のすべてのディレクトリとファイルも表示されます。
WinEunuuchs2Unix

@EliahKaganわかりました。--regex検索文字列で返される結果が多すぎるために必要でした。答えを見つけて見つけ、数分で更新するための2つの新しい例を見つけます。
WinEunuuchs2Unix

1
Eliahのポイントを明確にするために、そのfindコマンドは「ディレクトリ/display-auto-brightness。内のすべてのファイルのファイル名を出力することを意味しますを使用するつもりだったと思いますfind / -name display-auto-brightnessが、それでも多くのジャンク「許可が拒否されました」エラーが出力されます。
-wjandrea

@wjandreaはい、私が言ったように、ポイントはファイルを見つけることではなく、findコマンドの時間を計ることでした。キャッシュをフラッシュした後、有効なパラメーターでテストを再実行しています。次に、答えを更新します。
WinEunuuchs2Unix

1
@Winいいえ、あなたの例はまだ有効であり、ファイルが見つかったかどうかにかかわらず、処理時間はそれほど変化しないと思います。
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.