`updatedb` 和 `locate` 使用什么样的数据库?

Tim*_*Tim 25 find database locate updatedb

locate程序findutils扫描一个或多个文件名数据库并显示任何匹配项。find如果文件在上次文件名数据库更新期间存在,这可以用作非常快速的命令。

现在有很多种数据库,

那么updatedb更新和locate使用什么样的数据库呢?

谢谢。

Ste*_*itt 29

locate/ 的实现updatedb通常使用根据其需求量身定制的特定数据库,而不是通用数据库引擎。您会发现每个实现都记录了那些特定的数据库;例如:

  • GNU findutils' 记录在 中locatedb(5),几乎只是一个文件列表(具有特定的压缩算法);
  • mlocate的记录在 中mlocate.db(5),也可以被视为目录和文件(带有元数据)的列表。

  • 设计数据库归结为设计数据结构,所以了解这些,然后了解大小与速度的设计权衡......我不知道有什么好的特定资源,也许像_Programming Pearls_这样的资源很好地介绍了思考这些主题的方式(而不是过度思考它们)。 (11认同)
  • 多年来,我已经对locateb 和mlocate.db 做了一些工作。我最初有 perl 代码来为 debian 中的 `dlocate` 程序生成一个定位。我最终发现,仅仅 grep 一个文本文件比搜索一个定位文件快很多倍,而且考虑到现在磁盘的大小,文件大小的节省是微不足道的。所以我切换到只是grep。我还有一个本地 cron 作业,它在 mlocate cron 作业运行后将 mlocate.db 转储为纯文本,我使用本地 `qlocate` shell 脚本进行搜索......比运行 `mlocate` 快得多,并且还有一些有用的额外功能选项。 (3认同)
  • `locate` 使用的数据库只是存储在磁盘上的数据结构,因此从数据结构到相应的数据库相对简单。当您的问题提出时转向数据库完全是另一回事;有专门针对这些主题的书籍和课程。设计和开发诸如 MongoDB 或 PostgreSQL 之类的数据库管理系统是当今计算机科学和软件工程中较难的问题之一,尤其是在涉及分布式方面时。 (2认同)

jmu*_*lee 13

似乎是 C 结构的平面文件,使用 Gnu LibC OBSTACKS 宏写入/读取

查看来源

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

你可以得到类似的东西

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。最后的两个命令是做什么的? (2认同)
  • @Tim 第一个命令是从根 (`/`) 目录中搜索文件系统 (`find`),而不下降到其他文件系统 (`-xdev`)、常规文件 (`-type f`) 上的目录,而不是在 `*. git` 目录(`-not -path \*\.git\/\*`)。它压缩输出(`| gzip -9`)并将其保存到文件`/tmp/files.gz`(`> /tmp/files.gz`)。下一行是使用 `zgrep` 在压缩文件 `/tmp/files.gz` 中搜索文件 `file_i_want` (2认同)