updateb 怎么比 find 快这么多?

Pra*_*tic 11 find locate updatedb

怎么updatedb比 快这么多find

这是执行看似相似任务updatedbfind命令之间的定时比较。

比较.sh

#!/usr/bin/env bash

cmd="sudo updatedb"
echo $cmd
time eval $cmd

cmd="sudo find / \
    -fstype ext4 \
    -not \( \
        -path '/afs/*' -o \
        -path '/net/*' -o \
        -path '/sfs/*' -o \
        -path '/tmp/*' -o \
        -path '/udev/*' -o \
        -path '/var/cache/*' -o \
        -path '/var/lib/pacman/local/*' -o \
        -path '/var/lock/*' -o \
        -path '/var/run/*' -o \
        -path '/var/spool/*' -o \
        -path '/var/tmp/*' -o \
        -path '/proc/*' \
    \) &>/dev/null"

echo $cmd
time eval $cmd
Run Code Online (Sandbox Code Playgroud)

我的/etc/updatedb.conf:

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset cramfs debugfs devpts devtmpfs ecryptfs exofs ftpfs fuse fuse.encfs fuse.sshfs fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs shfs smbfs sockfs sshfs sysfs tmpfs ubifs udf usbfs vboxsf"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /net /sfs /tmp /udev /var/cache /var/lib/pacman/local /var/lock /var/run /var/spool /var/tmp"
Run Code Online (Sandbox Code Playgroud)

对于 find 命令,我刚刚指定了ext4文件系统,因为这是updatedb最终应该查看的唯一文件系统。我没有打扰文件扩展名,我不知道如何从中排除绑定安装,find但我没有。我还为“/proc”添加了一个排除项,它似乎被updatedb忽略了。我也应该忽略'/sys'。

如果有任何区别,我希望 find 命令会更快一点,因为它的规则更简单一些,而且不必写入磁盘。相反updatedb要快得多。

$ ./compare.sh
sudo updatedb

real    0m0.876s
user    0m0.443s
sys 0m0.273s

sudo find / -fstype ext4 -not \( -path '/afs/*' -o -path '/net/*' -o -path '/sfs/*' -o -path '/tmp/*' -o -path '/udev/*' -o -path '/var/cache/*' -o -path '/var/lib/pacman/local/*' -o -path '/var/lock/*' -o -path '/var/run/*' -o -path '/var/spool/*' -o -path '/var/tmp/*' -o -path '/proc/*' \) &>/dev/null

real    6m23.499s
user    0m14.527s
sys 0m10.993s
Run Code Online (Sandbox Code Playgroud)

他们在做什么不同?

ste*_*eve 15

请参阅手册页以了解updatedb“如果数据库已存在,则重用其数据以避免重新读取未更改的目录”。

而该find命令会遍历所有目录,而不管它们是否已更改。