updatebがfindよりはるかに速いのはなぜですか?

updatebがfindよりはるかに速いのはなぜですか?

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コマンドは、変更の有無にかかわらず、すべてのディレクトリを繰り返します。

おすすめ記事