![updateb 为什么比 find 快那么多?](https://linux22.com/image/68215/updateb%20%E4%B8%BA%E4%BB%80%E4%B9%88%E6%AF%94%20find%20%E5%BF%AB%E9%82%A3%E4%B9%88%E5%A4%9A%EF%BC%9F.png)
怎么比updatedb
快这么多find
?
以下是执行看似相似任务的命令updatedb
之间的定时比较。find
比较.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
我的/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"
对于 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
他们的做法有何不同?
答案1
请参阅手册页updatedb
“如果数据库已存在,则重用其数据以避免重新读取未更改的目录”。
而该find
命令会遍历所有目录,无论它们是否已更改。