找到与定位

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

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

还有其他差异吗? 在哪种情况下,人们更喜欢这一个? 什么时候locate数据库通常会更新?

locate非常适合查找文件并将其显示给人类。 你可以用它来做一些事情,但是我不相信它足以解析 – 你说 – 它是不可能保证内部数据库的状态,更是如此,因为它只安排从/etc/cron.daily/mlocate运行/etc/cron.daily/mlocate/etc/cron.daily/mlocate一次!

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

locate当然在我的工具箱中有一个位置,但它通常位于底部,作为寻找某些东西的最后努力。 它比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 

/开始搜索所有内容需要三分钟以上。 默认情况下会显示大量错误消息,您必须搜索它们才能找到所需内容。 仍然比grep更好地搜索整个驱动​​器需要53小时的字符串: `grep`ing字符串的所有文件需要很长时间

我知道我可以使用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 

locate命令只需不到一秒钟!

updatedb默认情况下每天只运行一次

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

 $ time sudo updatedb real 0m3.460s user 0m0.503s sys 0m1.167s 

虽然这需要3秒钟,但与find命令的3分钟以上相比,这个数字很小。

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

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

现在每隔五分钟更新一次,并且locate命令数据库几乎总是最新的。

但是没有属性?

您可以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: - 

摘要

我发布了这个答案,以显示定位的速度和易用性。 我试图解决其他人指出的一些命令缺点。

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