![`updatedb` 抓住一切可能的东西](https://linux22.com/image/207194/%60updatedb%60%20%E6%8A%93%E4%BD%8F%E4%B8%80%E5%88%87%E5%8F%AF%E8%83%BD%E7%9A%84%E4%B8%9C%E8%A5%BF.png)
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 身份运行。
正如标题所暗示的,我想要抓住一切可能。我不想限制locate
,updatedb
或限制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
/locate
和find /
所有文件中获得完全相同的结果;除其他问题外,由于 的内容/proc
总是在变化,因此您运行的时间updatedb
和运行的时间之间总是会出现变化find
。