查找与定位

查找与定位

有命令findlocate可以搜索磁盘上的文件。

我知道find递归处理搜索文件所需的所有子目录,因此速度很慢但却是最新的,而locate使用不时更新的数据库(具体什么时候?)来快速显示可能已过时的结果。

还有其他区别吗?在什么情况下人们会更喜欢其中一种?数据库locate通常什么时候更新?

答案1

locate实际上只适合查找文件并向人类展示。你可以用它做一些事情,但我不太相信它能够解析,而且 — 正如你所说 — 它不可能保证内部数据库的状态,尤其是因为它只计划从 运行一次/etc/cron.daily/mlocate,每天一次!

find是实时的。它可以过滤、排除、执行。它适合解析。它可以输出相对路径。它可以输出完整路径。它可以根据属性而不仅仅是名称来执行操作。

locate当然在我的工具箱里有一席之地,但它通常放在最底部,作为寻找某物的最后一搏。这比这更容易find

答案2

尽管我很喜欢奥利(真的非常喜欢!)但我不同意他的命令find。我不喜欢它。

find命令耗时超过三分钟

以这个简单的命令为例:

$ 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从 开始的所有内容。默认情况下,会出现大量错误消息,您必须搜索它们才能找到您要查找的内容。不过,这比搜索整个驱动​​器以查找包含以下内容的字符串/要好grep53小时在所有文件中查找字符串需要很长时间

我知道我可以摆弄 find 命令的参数以使其更好地工作,但这里的重点是运行所需的时间。

locate命令只需不到一秒钟

现在让我们使用locate

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

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

定位命令只需不到一秒钟!

updatedb默认每天仅运行一次

确实,updatedb更新定位数据库默认情况下每天只运行一次。您可以在搜索刚添加的文件之前手动运行它,方法是:

$ time sudo updatedb

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

find虽然这将花费 3 秒,但与命令的 3 多分钟相比,这很短。

我已更新我的,sudo crontab -e以包含底部的行:

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

现在每五分钟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相比之下,该命令有自己的数据库,速度快如闪电。

相关内容