Find

updateb 怎麼比 find 快這麼多?

  • July 2, 2015

怎麼updatedb比這快得多find

這是一個執行看似相似任務updatedb的命令之間的定時比較。find

compare.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

他們在做什麼不同?

請參閱手冊頁updatedb,“如果數據庫已經存在,則重用其數據以避免重新讀取未更改的目錄”。

而該find命令遍歷所有目錄,無論它們是否已更改。

引用自:https://unix.stackexchange.com/questions/213651