为什么`updatedb`程序运行这么快?


22

通常,当我的程序正在执行全盘扫描并遍历系统中的所有文件时,它们需要很长时间才能运行。相比之下,为什么updatedb运行如此之快?

Answers:


22

答案取决于locate您使用的版本,但很有可能是mlocate,它updatedb可以避免进行完整磁盘扫描而快速运行:

mlocate是locate / updatedb实现。“ m”代表“合并”:updatedb重复使用现有数据库,以避免重新读取大部分文件系统,这使updateb更快,并且不会浪费太多系统缓存。

(数据库存储每个目录的时间戳记ctimemtime,以较新的为准。)

与的大多数实现一样updatedbmlocate也会跳过文件系统和配置为忽略的路径。默认有没有在mlocate的情况下,但分布通常提供一个基本updatedb.conf而忽略网络文件系统,虚拟文件系统等(详见Debian的配置文件例如,这是在Debian中的标准实践,所以GNU的updatedb类似地配置)。


很好的问答,甚至都不知道有“差异”扫描。
Rui F Ribeiro

1
谢谢!我从未注意到修改文件还会更改其所有父目录的ctime和mtime。
hugomg

4
@hugomg我认为实际上没有。它仅应更改mtime其直接父对象的。
库萨兰达

因此,如果我理解正确,那么会mlocate在乎ctimemtime这意味着它只在乎目录条目列表是否相同(没有删除或添加的文件),这意味着它不在乎实际文件本身。那是对的吗 ?
Sergiy Kolodyazhnyy

@Sergiy:当然可以。 locate不是grep -R。它不读取文件内容。
凯文·

9

除了检查修改时间,mlocate也忽略具有大量无趣的或潜在的重复的文件,如在/etc/updatedb.conf指定(在所描述的文件系统的某些子树人updatedb.conf):

  • 绑定坐骑
  • 某些类型的文件系统(9p,afs,bdev等)
  • VCS储存库数据库(.git,.hg等)
  • 一些硬编码的目录(/ media,/ tmp,/ var / spool / cups等)。

不过,默认情况下并非如此,因此基本行为取决于所使用的发行版。(其他updatedb实现也支持配置的排除项。)
Stephen Kitt

确实。我在描述Fedora的默认设置。
hugomg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.