该locate
程序findutils
扫描一个或多个文件名数据库并显示所有匹配项。find
如果文件在上次文件名数据库更新期间存在,则可以将其用作快速命令。
如今有多种数据库,
那么,updatedb
更新和locate
使用哪种数据库?
谢谢。
该locate
程序findutils
扫描一个或多个文件名数据库并显示所有匹配项。find
如果文件在上次文件名数据库更新期间存在,则可以将其用作快速命令。
如今有多种数据库,
那么,updatedb
更新和locate
使用哪种数据库?
谢谢。
Answers:
locate
/的实现updatedb
通常使用根据其需求量身定制的特定数据库,而不是通用数据库引擎。您将找到每个实现记录的那些特定数据库。例如:
findutils
'记录在中locatedb(5)
,并且几乎只是文件列表(具有特定的压缩算法);mlocate
的记录在中mlocate.db(5)
,也可以视为目录和文件(带有元数据)的列表。locate
只是存储在磁盘上的数据结构,因此从数据结构转到相应的数据库相对简单。按照您的问题提出的观点迁移到数据库完全是另一回事。有专门针对这些主题的书籍和课程。设计和开发数据库管理系统(例如MongoDB或PostgreSQL)是当今计算机科学和软件工程中较难解决的问题之一,尤其是当您涉及分布式方面时。
dlocate
在debian中的程序生成一个locationb 。我最终发现,仅对文本文件进行grep操作比搜索一次locatedb要快许多倍,并且由于这些天的磁盘大小,文件大小的节省是微不足道的。所以我改用grep。我还有一个本地cron作业,在mlocate cron作业运行后将mlocate.db转储为纯文本,我使用本地qlocate
shell脚本进行搜索mlocate
。
似乎是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
find
从根目录(/
)搜索文件系统(),而不降级到其他文件系统(-xdev
)的目录,常规文件(-type f
)而不是*.git
目录(-not -path \*\.git\/\*
)中。压缩输出(| gzip -9
)并将其保存到文件/tmp/files.gz
(> /tmp/files.gz
)。下一行是与搜索zgrep
文件file_i_want
压缩文件内/tmp/files.gz
据我所知,后面是Berkeley DB,它是键/值无守护程序数据库。点击链接获取更多信息。摘自Wikipedia:
Berkeley DB(BDB)是一个软件库,旨在为键/值数据提供高性能的嵌入式数据库。Berkeley DB用C编写,带有用于C ++,C#,Java,Perl,PHP,Python,Ruby,Smalltalk,Tcl和许多其他编程语言的API绑定。BDB将任意密钥/数据对存储为字节数组,并为单个密钥支持多个数据项。Berkeley DB不是关系数据库。
数据库在RHEL / CentOS中的位置是/var/lib/mlocate/mlocate.db
(不确定其他发行版)。该命令locate --statistics
将为您提供有关数据库位置和一些统计信息的信息(示例):
Database /var/lib/mlocate/mlocate.db:
16,375 directories
242,457 files
11,280,301 bytes in file names
4,526,116 bytes used to store database
对于mlocate格式,这是手册页的标题:
一个mlocate数据库以一个文件头开始:一个8字节的魔术数字(如C文字那样是“ \ 0mlocate”),4个字节用于大字节序的配置块大小,1个字节用于文件格式版本(0),1个“要求可见性”标志的一个字节(0或1),2个字节的填充以及数据库根目录的NUL终止路径名。
标头后跟一个配置块,该配置块可确保在某些配置更改可能影响数据库内容时不重用数据库。配置块的大小(以字节为单位)存储在文件头中。配置块是一系列变量分配,按变量名称排序。每个变量分配都包含一个NUL终止的变量名称和一个NUL终止值的有序列表。值列表以另一个NUL字符终止。使用的顺序由strcmp()函数定义。
locate
/ updatedb
... 的执行情况
mlocate
绝对不使用Berkeley DB。