`updatedb` 抓住一切可能的东西

`updatedb` 抓住一切可能的东西

updatedb.findutils似乎并updatedb.mlocate没有抓住一切可能的东西。如何指示他们包含所有文件?

$ printf 'locate: %s, smaller than find: %s\n' "$(sudo locate '*' | wc -l | numfmt --grouping)" "$(sudo find / | wc -l | numfmt --grouping)"
locate: 9 348, smaller than find: 14 053

updatedb以 root 身份运行。

正如标题所暗示的,我想要抓住一切可能。我不想限制locateupdatedb或限制find在其范围内。

我无法修改.conf文件。我宁愿需要一个无需修改文件即可按原样工作的命令

答案仍然给出不同的结果

$ printf 'locate.mlocate: %s, smaller than find: %s\n' "$(sudo updatedb.mlocate --prune-bind-mounts no --prunefs "" --prunenames "" --prunepaths ""; sudo locate.mlocate '*' | wc -l | numfmt --grouping)" "$(sudo find / | wc -l | numfmt --grouping)"
locate.mlocate: 13 598, smaller than find: 14 053
$ printf 'locate.findutils: %s, smaller than find: %s\n' "$(sudo updatedb.findutils --prunepaths="" --prunefs=""; sudo locate.findutils '*' | wc -l | numfmt --grouping)" "$(sudo find / | wc -l | numfmt --grouping)"
locate.findutils: 13 455, smaller than find: 14 053

答案1

sudo find /总是会找到比locate合理配置更多的文件,即使updatedb以 root 身份运行也是如此,因为updatedb设置为跳过许多文件系统,包括/proc和等虚拟文件系统/sys

在该mlocate版本中,如果您查看/etc/updatedb.conf,您将看到指示updatedb跳过特定文件名、路径和文件系统类型的条目;例如:

PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph"
PRUNEFS="NFS afs autofs binfmt_misc ceph cgroup cgroup2 cifs coda configfs curlftpfs debugfs devfs devpts devtmpfs ecryptfs ftpfs fuse.ceph 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"

如果你想比较find /locate '*',你应该find准确地告诉扫描哪些文件系统;例如,如果您有单独的//home,请使用sudo find / /home -xdev | wc -l.

如果您想updatedb捕获更多文件,您可以/etc/updatedb.conf根据需要进行编辑,或覆盖命令行上的配置:

sudo updatedb --prune-bind-mounts no --prunefs "" --prunenames "" --prunepaths ""

对于findutils,可以进行类似的覆盖:

sudo updatedb --prunepaths="" --prunefs=""

如果不想覆盖系统数据库,可以使用-o /path/to/file( mlocate) 或--output=/path/to/file( findutils) 指定输出文件名。

您永远无法从updatedb/locatefind /所有文件中获得完全相同的结果;除其他问题外,由于 的内容/proc总是在变化,因此您运行的时间updatedb和运行的时间之间总是会出现变化find

相关内容