当前位置: 首页>>技术教程>>正文


查找与定位

,

问题描述

有命令findlocate在磁盘上搜索文件。

我知道find递归处理所有需要的子目录以搜索文件,因此速度很慢,但是up-to-date慢,而locate使用的数据库不时更新(确切地说是什么时候)以快速显示可能已经过时的结果。

还有其他区别吗?在哪种情况下,一个会偏爱另一个? locate数据库通常何时更新?

最佳办法

locate实际上仅适用于查找文件并将其显示给人类。您可以使用它做一些事情,但是我对它的解析不够信任,并且-正如您所说的-无法保证内部数据库的状态,而且更是如此,因为它仅计划从/etc/cron.daily/mlocate运行,每天一次!

find已上线。它过滤,排除,执行。适合解析。它可以输出相对路径。它可以输出完整路径。它可以基于属性,而不仅仅是名称。

locate当然在我的工具箱中有一个位置,但是通常会在底部找到last-ditch,以查找某些内容。它也比find容易。

次佳办法

我非常喜欢Oli(这很多!),我在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会花费三分钟以上的时间搜索所有内容。默认情况下,会显示大量错误消息,您必须在错误消息中进行搜索以找到所需的内容。仍然比grep更好地在整个驱动器中搜索需要53小时的字符串:`grep`ing all files for a string takes a long time

我知道我可以摆弄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

尽管这将花费3秒,但与find命令的3分钟以上相比,它很小。

我已经更新了sudo crontab -e,使其在底部包括以下行:

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

现在每五分钟运行一次updatedblocate命令数据库几乎总是up-to-date。

但是有没有属性?

您可以将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的速度和易用性。我试图解决其他人指出的某些命令short-comings。

find命令需要遍历整个目录结构以查找文件。 locate命令拥有自己的数据库,相比之下,它提供了闪电般的速度。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11852.html,未经允许,请勿转载。