ディスク上のファイルを検索するためのコマンドfind
およびlocate
があります。
find
はファイルを検索するために必要なすべてのサブディレクトリを再帰的に処理するため、低速ですが最新であるのに対し、locate
は時々(正確に)更新されるデータベースを使用することを知っていますただし、古い可能性のある結果を表示します。
他に違いはありますか?どの状況で、どちらを好むでしょうか? locate
データベースは通常いつ更新されますか?
私は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
コマンドには独自のデータベースがあり、比較すると非常に高速です。