Find
updateb 怎麼比 find 快這麼多?
怎麼
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
命令遍歷所有目錄,無論它們是否已更改。