与“查找”相比,是什么让“定位”如此之快?

Tii*_*ina 20 linux locate

在我的印象中,两者locatefind找到了一个文件,但为什么locate运行得这么快?

根据其文档,locate

描述
locate 读取由updatedb(8) 准备的一个或多个数据库,并将至少匹配一个模式的文件名写入标准输出,每行一个。

该数据库中有哪些文件?该数据库中是否有每个创建的文件?

Que*_*tin 46

在我看来,locate和find都是查找文件,但是为什么locate运行得这么快呢?

find搜索文件系统本身。它经过优化,可以告诉您给定文件的特定路径和频繁写入的所有信息(包括大小可能为数 GB 的文件的内容)。

locate搜索先前索引文件系统生成的数据库。该数据库针对执行的搜索类型进行了优化locate

该数据库中有哪些文件?该数据库中是否有每个创建的文件?

数据库由 填充updatedb。其中的文件由传递给 的选项决定updatedb。文件将位于其中,除非它们位于正在搜索的区域之外或者它们是自updatedb上次运行以来创建的。

例如,我的 Ubuntu 默认安装有:

PRUNE_BIND_MOUNTS="yes"
PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph /home/.ecryptfs /var/lib/schroot"
PRUNEFS="NFS afs autofs binfmt_misc ceph cgroup cgroup2 cifs coda configfs curlftpfs debugfs devfs devpts devtmpfs ecryptfs ftpfs fuse.ceph fuse.cryfs fuse.encfs fuse.glusterfs fuse.gvfsd-fuse fuse.mfs fuse.rozofs fuse.sshfs fusectl fusesmb hugetlbfs iso9660 lustre lustre_lite mfs mqueue ncpfs nfs nfs4 ocfs ocfs2 proc pstore rpc_pipefs securityfs shfs smbfs sysfs tmpfs tracefs udev udf usbfs"
Run Code Online (Sandbox Code Playgroud)

在文件中/etc/updatedb.conf

因此,它会索引除某些目录之外的所有内容,这些目录由于各种(但希望相当明显)原因和一堆不同的文件系统类型(通常包含秘密数据、远程文件系统上的数据和系统 API)不应该被索引。

  • @mpez0 - 是的,这就是为什么我在这个答案中说“或者如果它们是自 updatedb 上次运行以来创建的” (4认同)
  • locate 在反映文件系统的添加、删除或更改方面也有一些延迟;updateb 必须在看到更改之前运行。 (2认同)